动态更改菜单之ModifyMenu

        多语言支持,已经是桌面应用软件的发展趋势。用句流行的词就是“国际化”。除了语言翻译的工作外,比较重要的就是字符的编码问题。不过这些问题的讨论已经铺天盖地了,我就不想再多说细节了。我在此只记录一下我的软件“国际化”中的一个技术小片段:用ModifyMenu来动态加载文本信息,实现菜单内容的本地化功能。

        ModifyMenu函数原型:

/** MFC中的函数原型 */

/**
  * @param nPosition 该菜单项所在的位置索引,以0为第一个
  * @param nFlags 标志位,MF_BYCOMMAND、MF_BYPOSITION、MF_STRING,之间可以联合使用
  * @param nIDNewItem 资源ID
  * @param lpszNewItem 菜单内容文本
  
*/

BOOL ModifyMenu(
   UINT nPosition,
   UINT nFlags,
   UINT_PTR nIDNewItem 
= 0,
   LPCTSTR lpszNewItem 
= NULL 
);

/**
  * @param nPosition 该菜单项所在的位置索引,以0为第一个
  * @param nFlags 标志位,MF_BYCOMMAND、MF_BYPOSITION、MF_STRING,之间可以联合使用
  * @param nIDNewItem 资源ID
  * @param pBmp  图片资源
  
*/

BOOL ModifyMenu(
   UINT nPosition,
   UINT nFlags, 
   UINT_PTR nIDNewItem,
   
const CBitmap* pBmp 
);

详细说明:   MF_BYPOSITION主要用于通过偏移位置来标注需要操作的菜单项;MF_BYCOMMAND主要用于命令ID的情况;MF_STRING主要用于POPUP的菜单项更改文本内容。其中特别注意,资源ID必须不能被修改,否则原来定义的响应事件将失去作用。

        下面是我应用的一个代码片段:

menu.LoadMenu(IDR_MENU_BLANK); //装载自定义的右键菜单
menu.GetSubMenu(0)->ModifyMenu(0, MF_BYPOSITION | MF_STRING, ID_VIEW, LoadStringEx(ID_VIEW));
menu.ModifyMenu(ID_REFRESH, MF_BYCOMMAND, ID_REFRESH, LoadStringEx(ID_REFRESH));
menu.ModifyMenu(ID_PASTE, MF_BYCOMMAND, ID_PASTE, LoadStringEx(ID_PASTE));
menu.GetSubMenu(
0)->ModifyMenu(6, MF_BYPOSITION | MF_STRING, ID_CREATE, LoadStringEx(ID_CREATE));
menu.ModifyMenu(ID_32787, MF_BYCOMMAND, ID_32787, LoadStringEx(ID_32787));
menu.ModifyMenu(ID_32788, MF_BYCOMMAND, ID_32788, LoadStringEx(ID_32788));
menu.ModifyMenu(ID_32790, MF_BYCOMMAND, ID_32790, LoadStringEx(ID_32790));
menu.ModifyMenu(ID_32791, MF_BYCOMMAND, ID_32791, LoadStringEx(ID_32791));

        说点题外话:我要开始学习苹果Mac系统的开发了,听说比较难,搞得我也很有压力。不管了,在工作中学习,在项目中进步。学好自己想做的,不管怎么说做Mac上开发的人毕竟是少数,以后应该也算是紧俏人才吧?呵呵。想法可能太美好了。给自己加油!

阅读更多
个人分类: C++ 日积月累
上一篇C++写的DLL中如何添加非模式窗体
下一篇设计模式解决的问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭