zoukankan      html  css  js  c++  java
  • MFC多国语言——配置文件

      前段时间,因工作需要,本地化了一个英文版本的产品。

      在网上查阅了若干资料,在此进行一个简单的整理。

      在MFC程序中,实现多国语言的方式很多,我们选择的是使用配置文件的方法。

      在通过配置文件方式实现多国语言功能时,主要的工作是:

      1、将需要在界面上显示的文字保存到文件中。

      2、在使用这些资源时,不是从rc文件中获取,而是从文件中加载,动态显示。

      在配置文件中,需要保存各个资源的ID、各语言版本字符串的值。需要某个资源时,通过其ID查找到资源所在节点,获取相应语言的字符串值。

      有一个问题是需要考虑的,资源的ID都是UINT类型的,如果在配置文件中以UINT类型的数值作为节点的ID,标识一个资源的话,不容易维护。

      为解决这个问题, 我们可以借鉴.h文件中的做法。在.h文件中,为了易于维护,为每个UINT类型的ID都定义了相应的宏,例如:#define IDS_DATA    1001,而在rc文件中对该资源的定义为:IDS_DATA        "Data"。这样,在程序中使用时只用IDS_DATA来代表"Data"。

      在配置文件中,可以借鉴此做法。用一个XML文件来定义IDS_DATA与1001的对应关系;用另外一个文件来定义IDS_DATA与"Data"的对应关系。而维护资源的内容时,只需要修改资源内容的XML文件。

      MFC程序中,主要有三种资源:Menu、Dialog、String。要根据每种资源的特点,来设计相应的方式保存这些资源的文字内容,便于根据资源ID获取相应的文字内容。

      可以为每种资源封装一个公共方法,动态显示该资源的文本内容。

    Menu

      对Menu类的资源,可以封装一个公共函数,遍历Menu中的所有Item,为每个Item设置显示的文字。

      如何从配置文件中获取Menu Item相应的字符串呢?需要根据配置文件的结构封装相应的方法。

      在遍历菜单,设置各菜单项文字内容的过程中,需要的主要方法如下。

      对于Popup Menu,设置Menu Text的方法:

      ModifyMenu(hMenu, i, MF_BYPOSITION, i, menuStr);

      对于String Menu,设置Menu Text的方法:

      ModifyMenu(hMenu, nMenuID, MF_BYCOMMAND, nMenuID, menuStr);

      获取菜单子菜单的方法:

      HMENU hSubMenu = GetSubMenu(hMenu,i);

    Dialog

      对于Dialog类的资源,可以封装一个公共函数,遍历Dialog内的所有控件,为每个控件设置显示的文字内容。当然,还要设置Dialog的标题。

      获取各控件字符串的方法需要根据Dialog资源配置文件的组织方式来订。

      遍历Dialog,设置各控件文字内容时,需要用到的主要方法如下。

      设置Dialog标题的方法:

      ::SetWindowText(hWnd,caption);

      获取Dialog第一个子控件的方法:

      HWND hSubWnd = GetWindow(hWnd,GW_CHILD);

      获取Dialog子控件下一个控件的方法:

      hSubWnd = GetWindow(hSubWnd,GW_HWNDNEXT);

      利用以上两个方法,可以遍历Dialog中的所有控件。

      判断子控件是否为Window的方法:

      ::IsWindow(hSubWnd)

      通过以上判断,可以获知遍历是否完成。

    String

      对于String类的资源,配置文件结构很简单,只需要保存资源ID和各个语言版本对应的字符串值即可。

      可以封装一个公共方法,根据ID从配置文件中获取字符串的值。

      使用字符串资源的方式很多,例如:错误提示信息、Status Bar显示信息、ToolTip等等。主要的是,根据各种使用场合,如何修改相关代码,改为利用公共方法,从配置文件中读取字符串资源。

  • 相关阅读:
    20200917-2 词频统计
    20200910-2 博客作业
    20200910-1 每周例行报告
    20200910-3命令行和控制台编程
    使用Requests库实现api接口测试(Python)
    Python Lambda函数的几种使用方法
    文本与向量之间的转换
    Oracle连接出现error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    一图看懂新一代人工智能知识体系大全
    SqlDeveloper连接MySQL出现The connection property ‘zeroDateTimeBehavior’ acceptable values are: ‘CONVERT_TO_NULL’, ‘EXCEPTION’ or ‘ROUND’. The value ‘convertToNull’ is not acceptable 错误
  • 原文地址:https://www.cnblogs.com/xiaoyusmile/p/3557554.html
Copyright © 2011-2022 走看看