來源:https://www.cnblogs.com/qijicxl/p/3840157.html
如何使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函數中再做一次打開操作。
大致就是這個過程。大家也可以自己發揮。
附:
在程序中的字符串修改爲多語言的方法:
1、在StringTable中添加字符串對應的語言資源:字符串ID=IDS_TEST,Value="測試"
2、在使用的地方引用字符串資源:
CString str;
str.LoadStringW(IDS_STRING145);
AfxMessageBox(str);
3、右鍵StringTable -> 插入副本 -> 選擇對應的國際化語言。
對該StringTable的所有項進行翻譯後替代中文。