• MFC多语言程序版本,在不同的windows系统上的使用 FP_SetThreadUILanguage


    from: http://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)  
        {  
            returntrue;      
        }  
        else  
        {  
            returnfalse;  
        }  
    }
    

    这里又有一个问题,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);
        }
        return0;
    } 
    

    5. 在设置切换语言的时候,可以设置一个combobox,点击哪个语言就进行语言切换,设置一个全局变量,然后PostMessage,关闭,在WM_ONCLOSE函数中再做一次打开操作。

    大致就是这个过程。大家也可以自己发挥。

    -------------------------------------

    2014-07-12

    有问题可以和我交流,谢谢

    QQ:249451220

    如果问题解决起来不妥或者有更好的解决办法,麻烦请告知,帮助曾经和你一样的入门者,谢谢。
  • 相关阅读:
    (Java实现) 数塔问题
    (Java实现) 数塔问题
    Java实现 蓝桥杯VIP 算法训练 数的划分
    Java实现 蓝桥杯VIP 算法训练 数的划分
    (Java实现) 细胞
    理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
    一些常见的国际标准化组织
    Windows开发中一些常用的辅助工具
    如何分析程序的时间消耗
    C++代码覆盖率工具Coverage Validator
  • 原文地址:https://www.cnblogs.com/ourran/p/5290939.html
Copyright © 2020-2023  润新知