在VC 5.0中實現基於MFC的元件的本地化 (轉)
在VC 5.0中實現基於MFC的元件的本地化 (轉)[@more@]發信人: cvisual (貝貝), 信區: VisualC
標 題: 在VC 5.0中實現基於MFC的的本地化
發信站: BBS 水木清華站 (Thu May 7 23:08:34 1998)
Visual C++(以下簡稱VC)是公司的Visual 系列開發工具
之一。對非英語地區的員,不可避免地要解決軟體的本地化問題
。VC 本身就支援多語種,給本地化帶來了極大的方便。這裡我們
主要討論基於 MFC 的元件的本地化。
要實現那些使用 MFC 的元件的本地化,需要解決下面兩個問題。
元件本身的本地化
第一問題是,要實現元件本身的一些特殊資源的本地化,例如字元
串、對話方塊等等。由於大多數在 MFC 基礎上構架的元件也包含和使
用了一部分由 MFC 定義的資源,所以必須同時本地化這些 MFC 資源
。幸運的是,MFC 本身已提供了多種語言的本地化版本,它們包括:漢
語、德語、西班牙語、法語、義大利語、日語和韓國語。存在於VC光
盤中相應的 DevStudi VCMFC[src|include]l.xxx 目錄下," l
"代表"本地化"的意思,"l.chs"即代表簡體中文。將這些目錄下的 *
.rc 拷入中相應的目錄即可。當應用程式與MFC之間採用靜
態連結的時應採用該方法,但它只在VC 5.0的專業版與企業版中
才支援。
大多數的應用程式與MFC之間採用動態連結的方式,這時在Win95
的system目錄下必須有相應的MFC 資源 DLL 檔案的本地版本——MFC
4xLOC.DLL(Pwin95 OEMSR2版本提供的是MFC0 LOC.DLL)。將VC光碟的
目錄 DevStudioVCRedist 中的檔案:MFC42xxx.DLL 複製入Pwi95
的system目錄下,並更名為:MFC42LOC.DLL即可(其中MFC42CHS.DLL即
代表簡體中文版的資源 DLL 檔案)。拷入前除了要解決同名DLL相覆
蓋的版本問題外,還應注意以下兩方面的內容
首先,不應該在英文版的(如英文 Win95)上 MFC4xLOC.D
LL。因為英文版的資原始檔程式碼已內建於MFC4x.DLL 中,應用程式從M
FC4x.DLL 中載入程式碼的速度比從 MFC4XLOCD LL 中先搜尋再載入代
碼的速度要快得多。
其次,由於有多個版本的 MFC4xLOC.DLL ,在VC光碟的目錄 DevS
tudioVCRedist 中可同時找到如:MFC4xCHS.DLL——簡體中文版本
、MFC4xDEU.DLL——德國版本、MFC4xESP.LL——義大利版本等等。
所以在安裝之前,應先確定所安裝的MFC4xLOC.DLL 的本地版本代
號與所使用的Window 系統是否相一致,例如:只有MFC42CHS.DLL 才能
安裝在 Pwin95 的系統上。
需要指出的是,以上的方法會給應用程式的安裝帶來一定的複雜
性,因為的系統下可能會安裝多種本地化版本的應用程式。例如:
支援簡體中文;後來又裝了一個日文版的軟體而連結庫檔案MFC4xLOC.
DLL 只有一個,若後者覆蓋了前者,應用程式執行時就會發生資源連結
出錯。所以我們建議採用另一種方法,即建立自己的本地版本的MFC
資源 DLL 檔案,而不是直接MFC4xLOC.DLL 檔案,該方法後面會繼
續分析。
處理程式碼
第二個問題是,應處理好各元件本地化資源的程式碼,使之能良好地
執行於目標環境。大多數情況下,這依賴於應用程式對位元組的高位及
雙位元組字元的處理能力。在預設情況下,MFC對它們直接支援。
所以,本地化應用程式和DLL實質上只需用本地語言改寫相應的資
源即可。如果C++中不帶有需要本地化的字串或正文,那麼只
需對資原始檔作修改。實際上,使用者可以實現自己的元件,這樣無須重
建原始程式碼即可獲得本地版本。這或許很複雜,但很值得,MFC本身也
採用這種技術。可開啟資原始檔編輯器直接用本地語言進行編輯,但
這樣每次版本的升級都需對應用程式進行重建。
注意:VC 4.0或以後的版本直接支援多種語言的.RC檔案。
避免這樣做的一種方法就是建立一個分離的DLL並對其進行本地
化,該 DLL 有時也叫做"衛星式 DLL"。在程式執行期間它將被動態地
進行連結,此時資源將從這個"衛星式 DLL"載入,而不是從程式碼的主模
塊載入。MFC 直接支援這種方法,MFC4xLOC.DLL 本身就是一個本地化
的"衛星式 DLL",只不過是在預設狀況下是由 MFC 提供的。我們可以
建立一個自己的"衛星式 DLL",如有一名為MYAPP.EXE 的應用程式,它
的所有資源全來源於一個叫做 MYRES.DL 的檔案。這些都在其應用程
序的InitInstance 事件中完成,如下所示:
CMyApp::InitInstance()
{
// 初始化程式碼的開始部分
HINSTANCE hInst = LoadLibrary("myres.dll");
if (hInst != NULL)
AfxSetReHandle(hInst);
// 以下是其它初始化程式碼
.
.
.
}
這段程式碼後,MFC 將從 MYRES.DLL 中載入資源,而不是直接
從 MYAPP.EXE 中載入。
建立一個單一的資源DLL檔案並不難。先建立一個 DLL 專案檔案
,並加入.RC檔案和其他必要的資源,然後在連結器(Linker)的引數裡
增加一個 "/NOENTRY"引數即可。這個引數告訴連結器該 DLL 沒有接
入點,因為資源 DLL 檔案沒有程式碼。
另外,若應用程式以 Release 的方式建立(即EXE 檔案中
不嵌入程式碼),則還需完成以下步驟。在工程檔案裡,開啟選單 Pr
ojects/settings... ,分別選中c/c++ 頁和R esources頁,將其中的
引數[ /D "_AFXDLL"]去掉(它一般由 AppWizard 自動生成)。該引數
指定只從 MFC 的共享 DLL 檔案中載入資源,而並不定義其他的資源
來源,這樣使用者自己建立的資源 DLL 檔案將不起作用。
最後,由於AppWizard 是VC++的一大特色,VC++ 允許在使用AppWi
zard 建立基於MFC的應用程式時就可以選擇不同的語言,直接生
成本地化的程式框架。其中日文、韓文與簡體中文,由於需要支援雙
位元組版本的,所以在預設情況下,與這三種遠東語言相對應的
MFC AppWizard DLLs並沒有被VC 5.0的安裝程式裝入硬碟。因此,在
應用程式生成嚮導的第一頁下拉式列表框中,找不到這些語言條目,但
可以在VC光碟的 DevStudioSharedBi IDE 目錄中找到:
語言 AppWizard DLL
-----------------------------------
日文 ---- APPWZJPN.DLL
韓文 ---- APPWZKOR.DLL
簡體中文 ---- APPWZCHS.DLL
在簡體中文Pwin95下,只需將相應的APPWZCHS.DLL 檔案從VC光碟
複製入硬碟的 DevSu dioSharedIDEBinIDE 目錄下即可。這時,"
簡體中文"這一條目就會出現在應用程式生成嚮導的第一頁下拉式列
表框中,如下圖:
圖1
這樣,AppWizard 生成的應用程式框架將自動包含簡體中文的菜
單、標題、狀態列等。我們將框架程式編譯連結,執行後將會看到一
個漂亮的全中文介面。
所以,用VC製作簡體中文的軟體非常方便,感興趣的朋友可以繼續
檢視VC幫助系統,以獲得更多的資訊。
--
┌————┐
│ 貝 貝 │
└————┘
※ 來源:·BBS 水木清華站 bbs.tsinghua.edu.cn·[FROM: bbs.nju.edu.cn]
標 題: 在VC 5.0中實現基於MFC的的本地化
發信站: BBS 水木清華站 (Thu May 7 23:08:34 1998)
Visual C++(以下簡稱VC)是公司的Visual 系列開發工具
之一。對非英語地區的員,不可避免地要解決軟體的本地化問題
。VC 本身就支援多語種,給本地化帶來了極大的方便。這裡我們
主要討論基於 MFC 的元件的本地化。
要實現那些使用 MFC 的元件的本地化,需要解決下面兩個問題。
元件本身的本地化
第一問題是,要實現元件本身的一些特殊資源的本地化,例如字元
串、對話方塊等等。由於大多數在 MFC 基礎上構架的元件也包含和使
用了一部分由 MFC 定義的資源,所以必須同時本地化這些 MFC 資源
。幸運的是,MFC 本身已提供了多種語言的本地化版本,它們包括:漢
語、德語、西班牙語、法語、義大利語、日語和韓國語。存在於VC光
盤中相應的 DevStudi VCMFC[src|include]l.xxx 目錄下," l
"代表"本地化"的意思,"l.chs"即代表簡體中文。將這些目錄下的 *
.rc 拷入中相應的目錄即可。當應用程式與MFC之間採用靜
態連結的時應採用該方法,但它只在VC 5.0的專業版與企業版中
才支援。
大多數的應用程式與MFC之間採用動態連結的方式,這時在Win95
的system目錄下必須有相應的MFC 資源 DLL 檔案的本地版本——MFC
4xLOC.DLL(Pwin95 OEMSR2版本提供的是MFC0 LOC.DLL)。將VC光碟的
目錄 DevStudioVCRedist 中的檔案:MFC42xxx.DLL 複製入Pwi95
的system目錄下,並更名為:MFC42LOC.DLL即可(其中MFC42CHS.DLL即
代表簡體中文版的資源 DLL 檔案)。拷入前除了要解決同名DLL相覆
蓋的版本問題外,還應注意以下兩方面的內容
首先,不應該在英文版的(如英文 Win95)上 MFC4xLOC.D
LL。因為英文版的資原始檔程式碼已內建於MFC4x.DLL 中,應用程式從M
FC4x.DLL 中載入程式碼的速度比從 MFC4XLOCD LL 中先搜尋再載入代
碼的速度要快得多。
其次,由於有多個版本的 MFC4xLOC.DLL ,在VC光碟的目錄 DevS
tudioVCRedist 中可同時找到如:MFC4xCHS.DLL——簡體中文版本
、MFC4xDEU.DLL——德國版本、MFC4xESP.LL——義大利版本等等。
所以在安裝之前,應先確定所安裝的MFC4xLOC.DLL 的本地版本代
號與所使用的Window 系統是否相一致,例如:只有MFC42CHS.DLL 才能
安裝在 Pwin95 的系統上。
需要指出的是,以上的方法會給應用程式的安裝帶來一定的複雜
性,因為的系統下可能會安裝多種本地化版本的應用程式。例如:
支援簡體中文;後來又裝了一個日文版的軟體而連結庫檔案MFC4xLOC.
DLL 只有一個,若後者覆蓋了前者,應用程式執行時就會發生資源連結
出錯。所以我們建議採用另一種方法,即建立自己的本地版本的MFC
資源 DLL 檔案,而不是直接MFC4xLOC.DLL 檔案,該方法後面會繼
續分析。
處理程式碼
第二個問題是,應處理好各元件本地化資源的程式碼,使之能良好地
執行於目標環境。大多數情況下,這依賴於應用程式對位元組的高位及
雙位元組字元的處理能力。在預設情況下,MFC對它們直接支援。
所以,本地化應用程式和DLL實質上只需用本地語言改寫相應的資
源即可。如果C++中不帶有需要本地化的字串或正文,那麼只
需對資原始檔作修改。實際上,使用者可以實現自己的元件,這樣無須重
建原始程式碼即可獲得本地版本。這或許很複雜,但很值得,MFC本身也
採用這種技術。可開啟資原始檔編輯器直接用本地語言進行編輯,但
這樣每次版本的升級都需對應用程式進行重建。
注意:VC 4.0或以後的版本直接支援多種語言的.RC檔案。
避免這樣做的一種方法就是建立一個分離的DLL並對其進行本地
化,該 DLL 有時也叫做"衛星式 DLL"。在程式執行期間它將被動態地
進行連結,此時資源將從這個"衛星式 DLL"載入,而不是從程式碼的主模
塊載入。MFC 直接支援這種方法,MFC4xLOC.DLL 本身就是一個本地化
的"衛星式 DLL",只不過是在預設狀況下是由 MFC 提供的。我們可以
建立一個自己的"衛星式 DLL",如有一名為MYAPP.EXE 的應用程式,它
的所有資源全來源於一個叫做 MYRES.DL 的檔案。這些都在其應用程
序的InitInstance 事件中完成,如下所示:
CMyApp::InitInstance()
{
// 初始化程式碼的開始部分
HINSTANCE hInst = LoadLibrary("myres.dll");
if (hInst != NULL)
AfxSetReHandle(hInst);
// 以下是其它初始化程式碼
.
.
.
}
這段程式碼後,MFC 將從 MYRES.DLL 中載入資源,而不是直接
從 MYAPP.EXE 中載入。
建立一個單一的資源DLL檔案並不難。先建立一個 DLL 專案檔案
,並加入.RC檔案和其他必要的資源,然後在連結器(Linker)的引數裡
增加一個 "/NOENTRY"引數即可。這個引數告訴連結器該 DLL 沒有接
入點,因為資源 DLL 檔案沒有程式碼。
另外,若應用程式以 Release 的方式建立(即EXE 檔案中
不嵌入程式碼),則還需完成以下步驟。在工程檔案裡,開啟選單 Pr
ojects/settings... ,分別選中c/c++ 頁和R esources頁,將其中的
引數[ /D "_AFXDLL"]去掉(它一般由 AppWizard 自動生成)。該引數
指定只從 MFC 的共享 DLL 檔案中載入資源,而並不定義其他的資源
來源,這樣使用者自己建立的資源 DLL 檔案將不起作用。
最後,由於AppWizard 是VC++的一大特色,VC++ 允許在使用AppWi
zard 建立基於MFC的應用程式時就可以選擇不同的語言,直接生
成本地化的程式框架。其中日文、韓文與簡體中文,由於需要支援雙
位元組版本的,所以在預設情況下,與這三種遠東語言相對應的
MFC AppWizard DLLs並沒有被VC 5.0的安裝程式裝入硬碟。因此,在
應用程式生成嚮導的第一頁下拉式列表框中,找不到這些語言條目,但
可以在VC光碟的 DevStudioSharedBi IDE 目錄中找到:
語言 AppWizard DLL
-----------------------------------
日文 ---- APPWZJPN.DLL
韓文 ---- APPWZKOR.DLL
簡體中文 ---- APPWZCHS.DLL
在簡體中文Pwin95下,只需將相應的APPWZCHS.DLL 檔案從VC光碟
複製入硬碟的 DevSu dioSharedIDEBinIDE 目錄下即可。這時,"
簡體中文"這一條目就會出現在應用程式生成嚮導的第一頁下拉式列
表框中,如下圖:
圖1
這樣,AppWizard 生成的應用程式框架將自動包含簡體中文的菜
單、標題、狀態列等。我們將框架程式編譯連結,執行後將會看到一
個漂亮的全中文介面。
所以,用VC製作簡體中文的軟體非常方便,感興趣的朋友可以繼續
檢視VC幫助系統,以獲得更多的資訊。
--
┌————┐
│ 貝 貝 │
└————┘
※ 來源:·BBS 水木清華站 bbs.tsinghua.edu.cn·[FROM: bbs.nju.edu.cn]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988414/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [原始碼和文件分享]基於VC++的MFC類庫的飛機大戰遊戲的設計與實現原始碼C++遊戲
- VC++/MFC 教程1(英文) (轉)C++
- VC++/MFC 教程2(英文) (轉)C++
- VC++/MFC 教程3(英文) (轉)C++
- 在VC中所見即所得列印的簡易實現 (轉)
- 基於ARouter的Android元件化實現Android元件化
- 實現基於React的全域性提示元件ToastReact元件AST
- 實現基於React的移動端Swiper元件React元件
- 基於CC的Android MVVM 元件化實現AndroidMVVM元件化
- 基於VC + MSSQL實現的縣級醫院醫學影像PACSSQL
- 在VC中實現程式在啟動時隱藏 (轉)
- VC++/MFC 教程4&5(英文) (轉)C++
- VC++/MFC 教程6&7(英文) (轉)C++
- 基於heartbeat的NFS HA實現(轉)NFS
- 基於heartbeat的NFS HA實現 (轉)NFS
- 基於VC6.0的抓取TCP/IP資料包的C++實現TCPC++
- 基於MFC的大型資料檔案處理方法 (轉)
- 基於MFC的編寫執行緒快速入門 (轉)執行緒
- 影像平滑滾動效果的VC實現 (轉)
- SNMP用VC++6.0實現的方法 (轉)C++
- 基於 IntersectionObserver 實現一個元件的曝光監控Server元件
- 基於XML的購物車的實現(轉)XML
- Win32全域性鉤子在VC5中的實現 (轉)Win32
- VC++ MFC UpdateData()用法C++
- 基於 URL 的縮圖在 Laravel 中的實現Laravel
- MFC 多語言 本地化
- VC++、MFC、COM和ATL的區別C++
- 基於Decorator的React高階元件的思路分析與實現React元件
- 一個基於Vue的圖片輪播元件的實現Vue元件
- 基於MFC文件/視/框架程式之利劍 (轉)框架
- 淺談MFC中超類化技術的實現 (轉)
- VC中實現多格式影像的靈活轉換 (轉)
- 在VC++6.0開發中實現全屏顯示 (轉)C++
- mfc版本及其對應vc版本一覽表 (轉)
- IT轉型與基於雲的架構實現架構
- VB的ShowInTaskbar功能分析以及用VC的實現 (轉)
- 關於VC的編譯模式 (轉)編譯模式
- VC在windows下編寫用於序列通訊的程式 (轉)Windows