《VC语言6.0程序设计从入门到精通》第101章


实例 10…2:界面汉化实例。源代码在光盘中“10实例 10…2”目录下。
本节以创建一个默认语种为简体中文的 Languages 应用程序为例,进一步详细说明。该 
程序不含任何资源,应用程序根据系统的语种设置连接对应的资源链接库,以完成对中文和 
英文两种语言的支持。
附带光盘中的 chinese。dll 和 english。dll 两个动态链接库分别封装了中文资源和英文资源, 
下面具体介绍 Languages 应用程序的实现过程。
1.创建 Languages
用 MFC AppWizad(exe)创建新项目的工作区,选择 Simple Document 类型、中国中文(其 
他的选项选择默认) ,并且为了明确,将工作区目录改为“多语种支持”。
2 .添加数据成员
由于要动态地装入资源链接库,所以需要保存链接库的句柄以便在程序结束的时候释放 
·267 ·
…………………………………………………………Page 279……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
资源。将下述数据成员添加到 CLanguagesApp 类中,代码如下:
protected:
//资源链接库句柄
HINSTANCE m_hLangDLL;
3 .修改 InitInstance() 函数
应用程序需要判别系统的默认语种,并装入对应的资源链接库。将下面的代码加到 
InitInstance 函数中,代码如下:
BOOL CLanguagesApp::InitInstance()

AfxEnableControlContainer();
// 判定系统默认语种
WORD wLangPID=PRIMARYLANGID(::GetSystemDefaultLangID());
// 载入资源动态链接库
switch( wLangPID)

case LANG_CHINESE:
m_hLangDLL=::LoadLibrary(〃chinese。dll〃);
break ;
default:
m_hLangDLL=::LoadLibrary(〃english。dll〃);
break;

if(!m_hLangDLL)

AfxMessageBox(_T(〃无法装载资源链接库!〃)) ;
return FALSE ;

// 连接资源
AfxSetResourceHandle(m_hLangDLL) ;
……

其中,操作系统所使用的默认语种由 Win 32 函数 GetSystemDefaultLangID 取得。宏 
PRIMARYLANGID 取出主语言标识符进行判断,以正确选择应该调用的链接库。链接库的 
加载由 Win32 函数 LoadLibrary 实现。程序中所使用的资源库由 AfxSetResourceHandle 函数 
指定。
4 .处理 ExitInstance() 函数
程序退出时使用 Win 32 函数 FreeLibrary 卸载已经装入的动态链接库。将下列代码添加 
到 ExitInstance 函数中,代码如下:
·268 ·
…………………………………………………………Page 280……………………………………………………………
第 10 章 动态链接库
int CLanguagesApp::ExitInstance()

//释放资源链接库
if(m_hLangDLL)
AfxFreeLibrary(m_hLangDLL);
return CWinApp::ExitInstance();

5 .修改 OnDraw
为了说明是从资源链接库中动态地获取数据而不是从程序的执行体中获取,该程序从资 
源链接库中获取了一个字符串,并绘制在屏幕上。代码如下:
void CLanguagesView::OnDraw(CDC* pDC)

CLanguagesDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString strMsg;
strMsg。LoadString(IDS_HELLO);
pDC…》TextOut(60;15;strMsg);
// TODO: add draw code for native data here

6 .从项目中移走 Languages。rc 文件
因 为 Languages 自 身 并不 需 要 含 有 任 何 资 源 , 所 以 可 以从 项 目 列 表 文 件 中 移 走 
Languages。rc 文件(并不删除)。ClassWizad 不允许项目不包含资源文件,可以创建一个空资 
源文件并将其加入到项目中,然后重建信息文件(Languages。CLW ),使得 ClassWizad 可以继 
续管理程序的消息处理 。但在本例中所有的函数都已经加入,可不必为项目创建空资源文件。 
7 .建立项目
修 改 设 置 , 选 择 “ Project| Setting … ” 菜 单 命 令 , 在 Link 标 签 下 将 输 出 文 件 名 
DebugLanguages。exe 改为 Languages。exe 。编译项目,如果应用程序中没有任何资源,会出 
现找不到资源链接库的错误,下面的一系列步骤为本项目分别创建简体中文和美国英语的资 
源链接库。在这两个链接库建立后,把它们放到 Languages 项目目录中,程序就可以运行了。
建立中文资源链接库的主要步骤如下。
o 选择 Regular DLL…based 应用程序并单击“Finish ”按钮完成创建。动态链接库项目只 
包含资源,不需要其他文件,所以从项目中删除所有其他文件。
o 把 Languages 相关的资源文件拷贝到 Language_chinese 项目的对应目录下。
o 把 Languages。rc 加入到 Language_chinese 项目中,使得 Languages。rc 为项目中的惟一 
文件。
o 在串资源表(String Table)中添加串 IDS_HELLO=200 ,标题为“这是中文版 !!”。
·269 ·
…………………………………………………………Page 281……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
o 从 Project 菜单中选择“Setting…”选项。首先,将输出文件名DebugLanguage_chines 
e。dll 改为。。chinese。dll,将动态链接库直接建立在 Languages 项目目录下。然后在链接 
命令行中添加“/NOENTRY ”选项。最后,编译并建立动态链接库。
生成英文版资源文件最快捷的方法是创建一个基于英文版的临时项目,并把资源文件复 
制到英文链接库项目中。其处理方法与中文资源链接库类似。
注意:在修改资源组件设置时,不但要将 Project 菜单 Setting 对话框中 Resource 标签的默认文字 
改为“英语(美国)”,还要删除预处理定义中的“_AFXDLL ”。删除_AFXDLL 预处理器, 
可以使用户的链接库包含通用的 MFC 资源。否则,应用程序会从系统安装的 MFC 动态链 
接库中收集通用的 MFC 资源,应用程序特定资源会被本地化。
这样,应用
小说推荐
返回首页返回目录