1. 程式人生 > >MFC多語言程式版本,在不同的windows系統上的使用

MFC多語言程式版本,在不同的windows系統上的使用

如何使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函式中再做一次開啟操作。

大致就是這個過程。大家也可以自己發揮。