动态更改菜单之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));
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bengold1979/archive/2008/05/05/2395786.aspx