MFC多語言程式版本,在不同的windows系統上的使用
阿新 • • 發佈:2019-01-07
如何使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函式中再做一次開啟操作。
大致就是這個過程。大家也可以自己發揮。