剛接觸win32開發的會發現,用vs新建一個win32項目默認代碼里面的入口函數並不是WinMain而是_tWinMain或者wWinMain,這些都有什么區別呢?
WinMain對應的是多字節字符集(ANSI),wWinMain對應Unicode字符集。_tWinMain是tchar.h文件里面定義的:
#ifdef _UNICODE #define _tWinMain wWinMain #else #define _tWinMain WinMain #endif
編譯時當字符集為ANSI時就同於WinMain,字符集為Unicode時同於wWinMain。
要更改字符集的話,在vs里面點 項目->項目屬性
windows api很多函數都分為兩個版本,比如CreateWindow的定義如下:
#ifdef UNICODE #define CreateWindow CreateWindowW #else #define CreateWindow CreateWindowA #endif
那么,什么時候該用Unicode字符集,什么時候該用多字節字符集呢?
其實並不是程序中有中文時就必須用Unicode字符集,當windows系統語言為中文時,不管你選擇哪個字符集都是可以正常顯示中文的,但是系統語言不為中文時就會出現亂碼了。所以如果你的軟件需要適應多語言的windows系統的話就得用Unicode字符集。
另外需要說明的是,當字符集為Unicode時,向api函數傳遞的一個字符串的時候應該將該字符串轉換為Unicode編碼的,可用L轉換:
CreateWindow(wndClass, L"這是窗口標題", ......);