小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC的多國語言界面的實現(xiàn)

 QomoIT 2019-08-28

目前很多軟件都是要出口到多個國家,因此,為軟件提供多國語言支持就成為了一個基本條件。為軟件提供多國語言的支持的具體實現(xiàn)方法有很多,但基本原理都差不多,就是實現(xiàn)代碼和語言包的獨立,代碼根據(jù)設(shè)定的語言選擇語言包。

其中,MFC的資源文件就提供了對多國不同語言的支持功能,如果使用MFC開發(fā),直接用資源文件自帶的多國語言支持,可以省去不少的麻煩。

下面就介紹給MFC程序添加中英文的支持,開發(fā)環(huán)境為VS2010。

1.  新建工程

新建了一個對話框工程,工程名稱為MultiLanguages,默認(rèn)語言選擇是“中文”。

2.  添加多國語言的資源

在創(chuàng)建工程后,工程會添加默認(rèn)的資源,如主對話框,都是“中文”資源。現(xiàn)在我們需要添加相應(yīng)的英文的資源文件。

為主窗口IDD_MULTILANGUAGES添加英文資源的方法為:

(1)       打開Resource View窗口。

(2)       右鍵IDD_MULTILANGUAGES,點擊彈出菜單中的“Insert Copy”菜單,如下圖所示。

(3)       彈出窗口資源復(fù)制語言選擇窗口,選擇語言為“英語(美國)”,如下圖所示。

(4)       點擊OK,即完成英文版對話框的添加。完成添加后,IDD_MULTILANGUAGES就對應(yīng)于兩個不同語言版本的對話框了,如下圖所示。

使用同樣的方法,也可以為其他資源添加多國語言版本的支持。主要需要多國版本需要支持的有對話框、菜單和字符串。

添加多國語言的資源后,要對這些資源進(jìn)行不同語言的定制,根據(jù)資源對應(yīng)的語言,設(shè)置對話框和控件的標(biāo)題等。

3.  Locale

程序的語言選擇跟操作系統(tǒng)語言(System Locale)、用戶設(shè)置語言(User Locale)和線程語言(Thread Locale)有關(guān)。程序運行時,是根據(jù)線程語言來選擇資源的。如果程序中未對線程語言進(jìn)行設(shè)置,線程語言默認(rèn)采用用戶設(shè)置語言。設(shè)置線程語言的函數(shù)是SetThreadLocale。

設(shè)置線程語言為“中文”的代碼如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));

設(shè)置線程語言為“英語(美國)”的代碼如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));

設(shè)置線程語言要在對話框創(chuàng)建之前,否則無法更改對話框的資源。可以在CMultiLanguagesApp::InitInstance函數(shù)中的對話框初始化之前添加線程語言設(shè)置,分別設(shè)置為中文和英文語言,就可以查看到對話框界面的不同。

4.  字符串處理

程序的多國語言的支持,不僅包括界面的多國語言支持,也要包括各類字符串的多國語言支持,如彈出的提示信息。因此,在彈出提示信息時,也要為提示信息創(chuàng)建多個語言版本,并根據(jù)當(dāng)前線程的語言來選擇不同的提示信息。

例子:實現(xiàn)不同語言版本中按鈕的點擊次數(shù)的統(tǒng)計。

(1)       String Table中分別添加中英文的IDS_STRING_SAMPLE資源,內(nèi)容如下表所示。

中文

這個一個中文提示信息。\n點擊次數(shù):%d。

英文

This is a prompt message in English.\nClick Times:%d.

(2)       在主窗口控件中添加一個控件Button1,控件的中文名為“提示”,英文名稱為“Prompt”。為該控件添加一個左鍵單擊消息響應(yīng)函數(shù),該函數(shù)的內(nèi)容如下:

void CMultiLanguagesDlg::OnBnClickedButton1()

{

         // TODO: Add your control notification handler code here

         static int s_iClickTime = 0;

         s_iClickTime++;

         CString strPrompt = _T("");

         CString strFormat = _T("");

         strFormat.LoadString(IDS_STRING_SAMPLE);

         strPrompt.Format(strFormat, s_iClickTime);

         AfxMessageBox(strPrompt);

}

(3)       分別在CMultiLanguagesApp::InitInstance添加設(shè)置線程語言為中文和英文的代碼,然后多次點擊按鈕進(jìn)行測試。

中文版本彈出的提示框如下圖所示:

英文版本彈出的提示框如下圖所示:

5.  語言切換

窗口在初始化時候就導(dǎo)入了資源文件,在通過SetThreadLocale更換了線程語言后,窗口的資源并不會更改,必須要通過代碼來重新裝載資源。因為窗口中存在多種與線程語言相關(guān)的資源,重新啟動軟件一種叫快捷的更新語言環(huán)境的方法。

例:通過菜單來進(jìn)行語言切換,切換語言后重啟軟件。

(1)    為程序添加中英文菜單選項ID_LANGUAGE_SWITCH,并為該菜單添加消息響應(yīng)函數(shù),其中,m_bRestartFlag使用判斷關(guān)閉窗口時是否需要重啟程序的標(biāo)識。代碼如下。

void CMultiLanguagesDlg::OnLanguageSwitch()

{

         // TODO: Add your command handler code here

         // 讀取當(dāng)前線程的語言,并根據(jù)當(dāng)前線程語言進(jìn)行語言切換

         LCID lcidNew = GetThreadLocale();

         if (LANG_ENGLISH == PRIMARYLANGID(LANGIDFROMLCID(lcidNew)))

         {

                   lcidNew = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);

         }

         else

         {

                   lcidNew = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);

         }

         // 把語言設(shè)置寫入配置文件

         CFile file;

         file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);

         file.Write(&lcidNew, sizeof(lcidNew));

         file.Close();

         // 關(guān)閉窗口

         m_bRestartFlag = TRUE;

         PostMessage(WM_CLOSE, 0, 0);

}

(2)    在關(guān)閉窗口時,重啟動該程序。即在窗口響應(yīng)WM_CLOSE時,重啟程序。代碼如下:

void CMultiLanguagesDlg::OnClose()

{

         // TODO: Add your message handler code here and/or call default

         // 判斷是否需要重新啟動窗口

         if (m_bRestartFlag)

         {

                   CString strFileName = _T("");

                   GetModuleFileName(NULL, strFileName.GetBuffer(MAX_PATH), MAX_PATH);

                   ShellExecute(NULL, _T(""), strFileName, NULL, NULL, SW_SHOWNORMAL);

                   strFileName.ReleaseBuffer();

         }

         CDialogEx::OnClose();

}

(3)    在啟動軟件時,根據(jù)當(dāng)前軟件的配置文件中語言來設(shè)置線程語言,即在CMultiLanguagesApp::InitInstance函數(shù)中創(chuàng)建對話框之前設(shè)置線程語言,代碼如下:

         // 判斷你是否存在配置文件,如果存在,從配置文件中讀取語言設(shè)置

         CString strFileName = _T("Language.ini");

         if (PathFileExists(strFileName))

         {

                   LCID lcidThread = 0;

                   CFile file;

                   file.Open(strFileName, CFile::modeRead | CFile::typeBinary);

                   file.Read(&lcidThread, sizeof(LCID));

                   file.Close();

                   SetThreadLocale(lcidThread);

         }

(4)       通過點擊菜單來測試軟件的語言切換。

6. MessageBox的問題

由于MessageBox中的按鈕的語言是跟操作系統(tǒng)相關(guān)的,要想實現(xiàn)MessageBox按鈕的多語言化是很有一定難度的。我現(xiàn)在還沒有查到好的解決方法,很多網(wǎng)友的建議是拋棄MessageBox,自己建立對話框。

  7. 源代碼

源代碼的下載鏈接如下:

http://files.cnblogs.com/xianyunhe/MultiLanguages.rar

8. 相關(guān)函數(shù)和類型

與本地化相關(guān)的函數(shù)和類型如下:

 GetSystemDefaultLCID

GetSystemDefaultLocaleName

GetUserDefaultLCID

GetUserDefaultLocaleName

SetThreadLocale

GetThreadLocale

MAKELCID

MAKELANGID

LCIDToLocalName

LocalNameToLCID

LANGIDFROMLCID

PRIMARYLANGID

LCID

LANGID

LANG_CHINESE 0x04

LANG_ENGLISH 0x09

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多