解決國際化問題這的確是個老話重談了,因為這裡面確實也沒有什麼可以稱的上技術含量的,只是實現起來有點煩瑣,不過我還是要寫出來,希望剛接觸這方面的同行們不至於走太多的彎路。
由於MFC應用程序也有自己的資源文件,當你調用MFC函數比如 CString::LoadString 或其它 LoadIcon 時,MFC應用程序框架首先跟蹤搜索EXE文件的資源,然後才是DLL和MFC的資源,因此在使用純資源DLL時候,必須人為先改變資源的搜索順序,可以通過使用 AfxSetResourceHandle 函數來實現,具體實現如下:
BOOL CMultilanguageApp::InitInstance()
{
AfxEnableControlContainer();
if (m_bChinese)
{
m_hLangDLL=::LoadLibrary("chinese.dll");
}
else
{
m_hLangDLL=::LoadLibrary("english.dll");
}
AfxSetResourceHandle(m_hLangDLL);
……
}
下面開始談談具體的實現步驟。
一、創建主工程
步驟:
運行Visual Studio 6.0->File->New...->Projects;選擇Mfc AppWizard(exe),在右邊Project name下輸入multilanguage, 下一步選擇支持中文就可以呢;
從項目中移出所有的資源文件,把Resource面板中的所有文件移出,把FileView面板中的multilanguage.rc,Resource.h,以及Resource Files下的所有文件移出。(說明:移出的文件並不是從實際的文件目錄中刪除掉)
二、創建英文版的DLL
步驟:
運行Visual Studio 6.0->File->New...->Projects;選擇Mfc AppWizard(dll),在右邊Project name下輸入english, 下一步選擇 Regular Dll Using share MFC DLL,單擊Finish就可以了;
刪除不需要的文件:把Resource面板中的所有文件移出,把 FileView 面板中的english.rc,Resource.h,以及Resource Files下的所有文件移出,然後也可以從實際目錄中刪除掉;
復制相關的資源文件:把multilanguage目錄下的multilanguage.rc,Resource.h文件復制到english工程文件目錄下,還需要把 multilanguage/res 下的所有文件復制到english/res目錄下(這樣操作起來簡單,當然你可以根據需要,選擇復制的文件);
把3步復制的所有文件添加到項目中去;
把所有的中文的資源名修改為相關的英文資源,同時需要把支持的語言改為“english(U.S.).",把Project菜單 Setting 對話框中 Resource 標簽的缺省文字改為"english(U.S.).”,還需要在Resource標簽下刪
除預處理定義中的"_AFXDLL"。這樣用戶的鏈接庫包含通用的MFC資源;
然後編譯建立動態鏈接庫就OK了;
三、創建中文版的DLL
具體的方法同創建英文版的DLL一樣,把項目名改為chinese.只是從 Project 菜單中選擇 Setting… 選項。然後在Link標簽下"Project Options" 添加 "/NOENTRY" 選項。最後,編譯並建立動態鏈接庫。
四、修改 multilanguage工程
在 CMultilanguageApp 類中添加如下的成員變量:
private:
BOOL m_bChinese;
HINSTANCE m_hLangDLL;
構造函數中初始化:
CMultilanguageApp::CMultilanguageApp()
{
m_bChinese = TRUE;
m_hLangDLL = NULL;
}
在InitInstance()函數修改資源加載順序:
BOOL CMultilanguageApp::InitInstance()
{
AfxEnableControlContainer();
if (m_bChinese)
{
m_hLangDLL=::LoadLibrary("chinese.dll");
}
else
{
m_hLangDLL=::LoadLibrary("english.dll");
}
AfxSetResourceHandle(m_hLangDLL);
……
}
別忘了ExitInstance()函數釋放掉加載的dll資源
int CMultilanguageApp::ExitInstance()
{
if(m_hLangDLL)
AfxFreeLibrary(m_hLangDLL);
return CWinApp::ExitInstance();
}
最後編譯運行!
小結
以上的方法實現了中英文軟件界面,不過,只要稍做擴展,很容易實現對多語言的支持。
聯系方式:QQ:36201365
e-mail:[email protected]
本文配套源碼