【VC编程技巧】动态链接库☞1.5设计支持多国语言应用程序

引言:(转载请说明出处和作者)

好的软件,要推向国际化的软件都要支持多国语言,这时毋庸置疑的,它极大增强了软件的易用性!所以让应用程序支持多国语言是非常重要的!而动态链接库可以帮助我们很快掌握这一技巧。

下面通过例子程序来详细讲解创建支持多国语言应用程序。

例子程序的功能:

         1〉根据用户选择,弹出中文对话框还是英文对话框:


        2〉点击弹出后对话框上的按钮“设置Icon”来设置对话框的Icon,效果图如下(原来对话框是没Icon的)。

        3〉支持多国语言。

        4〉中文对话框效果图:

       5〉 英文版效果图:

实现方法(分三步):

      首先, 在资源DLL中创建两个对话框,如效果图:一个英文,一个中文。然后,通过应用程序根据需求(需要中文,还是英文)把这个DLL中相应资源对话框Load进全局内存,创建对话框,这完成了对话框的创建,最后,在应用程序中为DLL中的对话框设计对应的类,但不需要绑定对话框ID,手动添加按钮“设置Icon”的消息响应函数(无法通过类向导添加),改变对话框的Icon。


例子代码(根据上述的三步贴一下核心的代码):

  1. 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
  2. 应用程序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;
    } 
    
  3. 创建相应的类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()
    };
  4. 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);
    }

    
    
    
    
    
    
    
    
    
    
    
    










  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值