引言:(转载请说明出处和作者)
好的软件,要推向国际化的软件都要支持多国语言,这时毋庸置疑的,它极大增强了软件的易用性!所以让应用程序支持多国语言是非常重要的!而动态链接库可以帮助我们很快掌握这一技巧。
下面通过例子程序来详细讲解创建支持多国语言应用程序。
例子程序的功能:
1〉根据用户选择,弹出中文对话框还是英文对话框:
2〉点击弹出后对话框上的按钮“设置Icon”来设置对话框的Icon,效果图如下(原来对话框是没Icon的)。
3〉支持多国语言。
4〉中文对话框效果图:
。
5〉 英文版效果图:
。
实现方法(分三步):
首先, 在资源DLL中创建两个对话框,如效果图:一个英文,一个中文。然后,通过应用程序根据需求(需要中文,还是英文)把这个DLL中相应资源对话框Load进全局内存,创建对话框,这完成了对话框的创建,最后,在应用程序中为DLL中的对话框设计对应的类,但不需要绑定对话框ID,手动添加按钮“设置Icon”的消息响应函数(无法通过类向导添加),改变对话框的Icon。
例子代码(根据上述的三步贴一下核心的代码):
- lang.dll中创建两个两个对话框后资源文件Resource.h如下:
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by lang.rc // #define IDC_SETICON 3001//“设置Icon”按钮的ID和“Set Icon”按钮的ID #define IDD_DLG 3000//中文版对话框ID和英文版对话框ID // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 1002 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1002 #define _APS_NEXT_SYMED_VALUE 1000 #endif #endif
- 应用程序MultiLang通过函数[GetDlgTemplate]加载DLL[lang.dll]中对话框资源到内存中,然后通过函数[OnZhshow中文和OnEnshow引文]创建对话框:
//取对话框资源到内存中 //nFlag = 0 取中文版对话框 //nFlag = 1 取英文版对话框 LPCDLGTEMPLATE CMultiLangDlg::GetDlgTemplate(UINT nFlag) { if(nFlag == 0)//中文版对话框 { //查找中文对话框资源 HRSRC hDialog = ::FindResourceEx( m_hInstance, RT_DIALOG, MAKEINTRESOURCE(IDD_DLG), MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED) ); //加载对话框资源到全局Memory中 HGLOBAL hData = ::LoadResource(m_hInstance, hDialog); if(hData != NULL) { //Lock资源,并得到资源的首地址 LPCDLGTEMPLATE lpDialogTemplate = (LPCDLGTEMPLATE)::LockResource(hData); return lpDialogTemplate; } } else if(nFlag == 1)//英文版对话框 { HRSRC hDialog = ::FindResourceEx( m_hInstance, RT_DIALOG, MAKEINTRESOURCE(IDD_DLG), MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US) ); HGLOBAL hData = ::LoadResource(m_hInstance, hDialog); if(hData != NULL) { LPCDLGTEMPLATE lpDialogTemplate = (LPCDLGTEMPLATE)::LockResource(hData); return lpDialogTemplate; } } return NULL; } void CMultiLangDlg::OnZhshow() { // TODO: Add your control notification handler code here //获取中文对话框的内存地址(0:中文版对话框) LPCDLGTEMPLATE lpDialogTemplate = GetDlgTemplate(0); // m_dllDlg.CreateIndirect(lpDialogTemplate, NULL); // m_dllDlg.ShowWindow(SW_SHOW); //模态对话框的创建 m_pdllDlg = new CDllDlg(); m_pdllDlg->InitModalIndirect(lpDialogTemplate, NULL); m_pdllDlg->DoModal(); delete m_pdllDlg; m_pdllDlg = NULL; } void CMultiLangDlg::OnEnshow() { // TODO: Add your control notification handler code here //获取英文版话框的内存地址(1:英文版对话框) LPCDLGTEMPLATE lpDialogTemplate = GetDlgTemplate(1); // m_dllDlg.CreateIndirect(lpDialogTemplate, NULL); // m_dllDlg.ShowWindow(SW_SHOW); //模态对话框的创建 m_pdllDlg = new CDllDlg(); m_pdllDlg->InitModalIndirect(lpDialogTemplate, NULL); m_pdllDlg->DoModal(); delete m_pdllDlg; m_pdllDlg = NULL; }
- 创建相应的类CDllDlg(它必须是继承于CDialog),无需指定对话框资源(从lang.dll中动态去加载),添加“设置Icon”按钮的消息响应(3处地方):
class CDllDlg : public CDialog { // Construction public: CDllDlg(CWnd* pParent = NULL); // standard constructor ~CDllDlg(); ... protected: //存放来自应用程序Icon的句柄 HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CDllDlg) // NOTE: the ClassWizard will add member functions here //}}AFX_MSG //手动添加设置Icon函数的声明 afx_msg void OnSetIcon(); DECLARE_MESSAGE_MAP() };
BEGIN_MESSAGE_MAP(CDllDlg, CDialog) //{{AFX_MSG_MAP(CDllDlg) // NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAP //手动添加设置Icon按钮的消息映射 ON_BN_CLICKED(IDC_SETICON, OnSetIcon) END_MESSAGE_MAP()
void CDllDlg::OnSetIcon() { //设置对话框Icon SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); }