如何使MFC程序界面支持多國語言?這次使用後給自己做一個總結。
我們使用vc6.0的版本來試驗
1. 切換到資源視圖,右鍵Dialog->Insert Copy
2. ok後,會出來一個語言的選項,這裏可以根據需要選擇語言
3. 點擊ok後,出現一份copy,不過裏面是英文的。
這時,如果你源對話框中帶中文的話在英文界面中就會顯示亂碼了。需要手動改爲英文的。
①源對話框
② copy的對話框,手動修改成英文的就ok了。
4. 如何讓程序顯示正確的語言呢?
我這邊是通過寫到ini文件裏面去,比對是哪種語言,然後顯示爲哪種語言的。
在InitInstance()函數裏面添加判斷。
用到的函數有SetThreadUILanguage和SetThreadLocale,但SetThreadLocale不支持win7及以上版本,所以須做判斷,是否爲win7及以上版本,再決定用什麼函數
來設置相應的語言。
CString strValue,strCpyFile,strtemp,strLanguage; char itemVal[256]; int len; GetModuleFileName(NULL,strValue.GetBuffer(MAX_PATH),MAX_PATH); strValue.ReleaseBuffer(); len=strValue.ReverseFind('\\'); strValue=strValue.Left(len); strtemp=strValue; strtemp += "\\TestDll\\copyfiles.ini"; // 找到我寫入的配置文件,copyfile.ini文件。 ::GetPrivateProfileString("TestSequence","Language","",itemVal,256,strtemp); strtemp = itemVal; strLanguage = strtemp; // 這裏區分了兩種語言,我寫入ini文件的是ENGLISH 和 CHINESE if("ENGLISH" == strLanguage) { //SetThreadUILanguage(); if (IsWin7()) { SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK)); }else { SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), SORT_DEFAULT)); } }else { if (IsWin7()) { SetThreadUILanguage(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK)); }else { SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK), SORT_DEFAULT)); } }
這裏貼下IsWin7()函數的判斷,其實是判斷了win7及以上的版本。
bool IsWin7() { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi); // win7的系統版本爲NT6.1 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 0) { return true; } else { return false; } }
這裏又有一個問題,SetThreadUILanguage該函數在vc6.0中不認識,在vs2008中是可以認識這個函數的,(vc6.0差不多是該被替換啦- -!)我們就採取動態獲取的方式來操作。
typedef LANGID (WINAPI *FP_SetThreadUILanguage)(LANGID LangId); LANGID SetThreadUILanguage(LANGID lcid) { HMODULE hKernel32 = GetModuleHandle(_T("Kernel32.dll")); FARPROC pFn = GetProcAddress(hKernel32, "SetThreadUILanguage"); FP_SetThreadUILanguage pSetThreadUILanguage = (FP_SetThreadUILanguage)pFn; if (pSetThreadUILanguage) { return pSetThreadUILanguage(lcid); } return 0; }
5. 在設置切換語言的時候,可以設置一個combobox,點擊哪個語言就進行語言切換,設置一個全局變量,然後PostMessage,關閉,在WM_ONCLOSE函數中再做一次打開操作。
大致就是這個過程。大家也可以自己發揮。