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函數中再做一次打開操作。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章