《windows程序设计》第二章学习心得
Unicode簡(jiǎn)介
Unicode是ASCII字符編碼的一個(gè)擴(kuò)展。Unicode用的是16位字符編碼,而不是像ASCII那樣的7位編碼。
---------------------------------------------------------------------------------------------------------------------------------------------
C語(yǔ)言中寬字符是基于wchar_t數(shù)據(jù)類型的。
typedef unsigned short wchar_t;
wchar_t c = 'A';等同于wchar_t c = L'A';
---------------------------------------------------------------------------------------------------------------------------------------------
wchar_t str[1000] = {0};
wcscpy(str, L"Hello");
wcscpy(str, TEXT("Hello"));???
C++標(biāo)準(zhǔn)庫(kù)函數(shù)提供了字符和字符串的操作函數(shù),并提供了其UNICODE版本,如:
char *strcpy(char *strDestination, const char *strSource);
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource); wcscpy()即為strcpy()的寬字符版本,與_T類似的,Visual C++提供了類似的同名函數(shù):
#ifdef UNICODE??????
#define _tcscpy wcscpy?
#else?????
#define _tcscpy strcpy?
#endif?
_tcscpy
在編譯時(shí)會(huì)根據(jù)條件被替換,
如果是 非UNICODE 工程,它就被替換為 strcpy
UNICODE 工程被替換為 wcscpy
?
?
寬字符的輸出問(wèn)題:
wchar_t str[] = L"qwe123";
C語(yǔ)言輸出:wprintf(L"%s\n", str);
C++輸出:wcout << str << endl;
相比如果輸出漢字的話:
wchar_t str[] = L"哇哈哈";setlocale(LC_ALL, "");wcout << str << endl;wprintf(L"%s\n", str);需要本地化函數(shù)輸出。
char*?setlocale(int?category,?const?char* locale);
category:為locale分類,表達(dá)一種locale的領(lǐng)域方面,通常有下面這些預(yù)定義常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,其中 LC_ALL 表示所有其它locale分類的并集。
locale:為期望設(shè)定的locale名稱字符串,在Linux/Unix環(huán)境下,通常以下面格式表示locale名稱:language[_territory][.codeset][@modifier],language 為 ISO 639 中規(guī)定的語(yǔ)言代碼,territory 為 ISO 3166 中規(guī)定的國(guó)家/地區(qū)代碼,codeset 為字符集名稱。
C 和 C++ 的標(biāo)準(zhǔn)庫(kù)分別有自己的 locale 操作方法,C 標(biāo)準(zhǔn)庫(kù)的 locale 設(shè)定函數(shù)是 setlocale(),而 C++ 標(biāo)準(zhǔn)庫(kù)有 locale 類和流對(duì)象的 imbue() 方法。
-----------------------------------------------------------------------------------------------------------------------------------------------------
在使用寬字符的時(shí)候,字符串的字符長(zhǎng)度并沒(méi)有改變,改變的只是字節(jié)的長(zhǎng)度。
#include <iostream> #include <cstdlib> using namespace std;int main() {wchar_t str[] = L"12345";cout << "sizeof(str) = " << sizeof(str) << endl;cout << "sizeof(wcslen) = " << wcslen(str) << endl;return 0; }輸出:sizeof(str) = 12
sizeof(wcslen) = 5
請(qǐng)按任意鍵繼續(xù). . .
-------------------------------------------------------------------------------------------------------------------------------------------------------
學(xué)習(xí)過(guò)程中,出現(xiàn)了MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
出現(xiàn)這個(gè)的原因是:
我接著使用了先前編輯windowsGUI程序使用的入口還是WinMain,而此時(shí)是W32控制臺(tái)程序,沒(méi)有進(jìn)行轉(zhuǎn)化。
解決方案見(jiàn):http://blog.csdn.net/lgh1992314/article/details/8701358
MessageBox的使用:
VS2010下默認(rèn)是UNICODE編碼,所以進(jìn)行MessageBox輸出的時(shí)候得注意編碼方式。
1、我們可以強(qiáng)制使用ANSI編碼方式,即MessageBoxA。
#include <windows.h> #include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {char str[1024] = {0};sprintf(str, "%s","12345");MessageBoxA(NULL, str, str, 0);return 0; }2、使用UNICODE編碼,注意user32.dll里并沒(méi)有MessageBox的入口點(diǎn),僅僅是簡(jiǎn)單的#define MessageBoxW?MessageBox #include <windows.h> #include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {wchar_t str[1024] = {0};wsprintf(str, L"%s",L"哇哈啊哈");MessageBox(NULL, str, str, 0);return 0; }-------------------------------------------------------------------------------------------------------------------------------------------
如何定義UNICODE標(biāo)識(shí)符?
UNICODE標(biāo)識(shí)符的定義要在所有源文件之上,當(dāng)然包括windows.h,加上一句 #define UNICODE
--------------------------------------------------------------------------------------------------------------------------------------------
在windows程序中不能使用cin、cout、scanf等標(biāo)準(zhǔn)輸入輸出函數(shù)。
------------------------------------------------------------------------------------------------------------------------------
格式化的消息框-----顯示視頻顯示器的寬度和高度。
#include <windows.h> #include <stdio.h> #include <tchar.h>int CDECL MessageBoxPrintf(TCHAR *szCaption, TCHAR *szFormat, ...) {TCHAR szBuffer [1024];va_list pArgList;va_start(pArgList, szFormat);_vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArgList);va_end(pArgList);return MessageBox(NULL, LPWSTR(szBuffer), LPWSTR(szCaption), 0); }int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR lpCmdLine, int iCmdShow) {int cxScreen, cyScreen;cxScreen = GetSystemMetrics(SM_CXSCREEN);cyScreen = GetSystemMetrics(SM_CYSCREEN);MessageBoxPrintf(TEXT("Screen"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen); }顯示效果:
轉(zhuǎn)載于:https://www.cnblogs.com/lgh1992314/archive/2013/03/20/5835161.html
總結(jié)
以上是生活随笔為你收集整理的《windows程序设计》第二章学习心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 20130320java基础学习笔记-d
- 下一篇: 测试中的黑天鹅