1.打開Visual Studio 2008,新建一個基於對話框工程,名稱爲LanguageTest,不使用Unicode庫 ,資源語言一共有十種(當前操做系統爲Windows 7簡體中文版),以下圖所示:
在此選擇「中文(簡體,中國)」,單擊「完成」按鈕。
2.在對話框設計界面上,放置一個按鈕(ID號IDC_SHOW_BUTTON)、一個靜態文本(ID號IDC_TEXT_STATIC,必須改其默認ID號)和一個編輯框(ID號IDC_TEXT_EDIT),資源視圖以下所示:
能夠看到資源視圖裏面都是簡體中文的資源文件,如今在「String Table」字符串表類型下,雙擊打開其子項「String Table」,默認只有一條字符串,是窗口菜單裏的「關於 LanguageTest(&A)...」,如圖所示:
如今點一下第二行(以黑色外框標誌),新建一條字符串(值會默認增加,注意不要與已有的衝突),「標題」是「ID」號所表明的字符串內容,咱們增長字符串以下圖所示:
3.在「解決方案管理器」下雙擊打開「LanguageTestDlg.cpp」文件,在其初始化函數OnInitDialog()增長以下紅色代碼:windows
編譯運行,結果以下圖所示:
4.製做英文版的「String Table」。右擊「資源視圖」下的「String Table」子項,選擇「插入副本」,在彈出的對話框選擇「英語(美國)」,以下圖所示:
「肯定」按下以後,就會多出一個字符串資源來,而且在後面名稱多了標記「[英語(美國)]」,雙擊打開其內容與簡體中文字符串資源同樣,以下圖所示:
將全部字符串修改「標題」內容爲英文,以下圖所示:
再編譯生成,此時應用程序就能適應簡體中文操做系統和英文美國操做系統了,會自動顯示爲默認操做系統語言。但是因爲此時沒有英文版系統能夠驗證,沒法肯定是否徹底正確,待之後驗證。
5.接下去,欲使用SetThreadLocale自由切換程序界面語言,在應用程序類初始化函數InitInstance()添加以下代碼:app
運行程序,出現問號亂碼狀況,當前Windows 7系統的顯示語言只有「中文(簡體)」,而「當前系統區域設置」爲「中文(簡體,中國)」,以下圖所示:框架
自由切換語言失敗,參考MSDN幫助文檔,對的介紹說明:http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx函數
另有一篇文章討論SetThreadLocale no longer changes GUI language in Vistahttp://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/d3a44b1c-900c-4c64-bdf8-fe94e46722e2測試
替換成以下代碼:spa
運行發現能夠顯示「英文」資源字符串,以下圖所示:
可使用GetUserDefaultUILanguage()判斷當前用戶界面語言,以下當用戶界面語言爲「簡體中文」時,設置爲「英文(美國)」:操作系統
在Windows XP簡體中文版下,非Unicode程序的語言爲「中文(中國)」,代碼頁轉換表有包含「US-ASCII」,在Windows 7下未找到「代碼頁轉換表」,使用SetThreadLocale和SetThreadUILanguage(注:靜態連接而後到XP下測試的 )都能將用戶界面語言設置成「英文(美國)」,以下圖所示:.net
改變「控制面板」裏面的「區域選項」語言爲「英語(美國)」,則顯示成問號,緣由在於SetThreadLocale設置的語言與「區域選項」裏面的語言同樣,如果同樣,則不操做,以下圖所示:設計
在此中英文版本資源下,在中英文系統語言環境下,就會自動切換不一樣語言資源,而後在另外系統語言環境下(如:日語),就設定程序語言爲英文(英文在大多數系統下都支持),代碼以下:(未能徹底測試)code
01 02 03 04 05 06 07 08 09 10 11 12 13 14 |
if ((GetSystemDefaultLangID() != MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED)) && (GetSystemDefaultLangID() != MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US))) { OSVERSIONINFO ovs; ovs.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (::GetVersionEx(&ovs)) { if (ovs.dwPlatformId == VER_PLATFORM_WIN32_NT && ovs.dwMajorVersion >= 6 && ovs.dwMinorVersion >= 0) { SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); } else SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), SORT_DEFAULT)); //SetThreadLocale(GetUserDefaultLCID ) } } //SetThreadLocale(GetUserDefaultLCID )//第一頁表明數字貨幣時間,第二頁是系統UI和軟件界面,第三頁高級是非unicode程序界面語言。//下面是這三個頁面設置時,不一樣的函數的影響: // 區域選項 語言 高級//GetUserDefaultLangID 改變 不變 不變 //GetSystemDefaultLangID 不變 不變 改變//GetUserDefaultUILanguage 改變 改變 不變 |