随笔-145  评论-173  文章-70  trackbacks-0

8.动态添加一个菜单。即:资源文件中没有该菜单,但是可以在代码中进行动态的添加,使得运行的时候出现一个菜单。
在CMainFrame的OnCreate函数中,添加如下代码:
 CMenu menu;
 menu.CreatePopupMenu();
 GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"显示");
 menu.AppendMenu(MF_STRING,001,"显示1");
 menu.AppendMenu(MF_STRING,002,"显示2");
 menu.AppendMenu(MF_STRING,003,"显示3");
 menu.Detach();
此函数就是实现了初始化菜单的功能。特别注意的是,需要最后的一个Detach函数,因为此函数实现了将句柄和局部变量分离的目的。
这个是因为menu是局部变量,所以需要如此进行操作,在函数结束之后,menu会自动销毁,所以需要。如果将menu作为该类的成员,那么就不需要进

行这个操作

 

9.动态添加菜单和菜单项。即:插入菜单项,某个列的菜单,或者插入某个菜单的项目到某列中。
同样是CMainFrame菜单中的OnCreate函数,添加如下代码:
 CMenu menu;
 menu.CreatePopupMenu();
 GetMenu()->InsertMenu(3,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,"显示");
 menu.AppendMenu(MF_STRING,001,"显示1");
 menu.AppendMenu(MF_STRING,002,"显示2");
 menu.AppendMenu(MF_STRING,003,"显示3");
 menu.Detach();
 GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,004,"显示4");
 GetMenu()->GetSubMenu(1)->InsertMenu(ID_EDIT_CUT,MF_BYCOMMAND|MF_STRING,005,"显示5");

此部分的代码功能是:首先插入一个菜单,为“显示”,然后在“显示”下面插入菜单项“显示1”,“显示2”,“显示3”
然后,再在某些菜单下面添加菜单项“显示4”和“显示5”。

具体讲解AppendMenu和InsertMenu的使用:
1.AppendMenu的使用。
原型如下:
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
功能:将一个新的条目插入到菜单的尾部。
参数说明:nFlags表示的是新菜单项的信息(MF_STRING,MF_OWNERREAW,MF_SEPARATOR)
nIDNewItem表示的是新菜单项的ID号。
lpszNewItem表示的是新菜单项的内容。
关键:插入到尾部。。(Append)

2.InsertMenu的使用。
原型如下:
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
功能:插入一个菜单项或者菜单。第一个就是插入一个菜单:GetMenu()->InsertMenu(3,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,"显示");
然后在这个菜单下面添加菜单项。
第二个是插入一个菜单项目,即“显示5”。
GetMenu()->GetSubMenu(1)->InsertMenu(ID_EDIT_CUT,MF_BYCOMMAND|MF_STRING,005,"显示5");
参数说明:
nPosition:新插入菜单的位置。(在XX之前)
nFlags:描述菜单的位置。BYCOMMAND是用ID号表示,BYPOSITION则是用索引表示。
nIDNewItem:新菜单项的ID号。
lpszNewItem:新菜单项的内容。


10.动态添加菜单的响应消息。
前面的代码讲解了如何动态的添加菜单,下面来说说如何响应这个菜单对应的函数。如果仅仅添加一个菜单而没有响应的函数,那么就可能没有效果

。所以,需要将进行消息映射,如何?
前面,在创建一个菜单的时候,都用到了ID,只是,具体的指定了一个值,于是,下面,我们需要将这个具体的值,产生对应的函数。
首先,在资源文件中用 #define ID IDNum的形式来创建这个ID的值,因为只有这样,才可以更加直观的为我们的菜单添加函数,而且,也为后面的消

息映射添加方便。
其次,需要对这个ID对应的消息来响应。可是打开Classwizard后,却发现没有那个新加入的ID,因为不是由编译器添加的,所以会有这个问题。
没关系,我们自己添加,如何呢?
打开MainFrame.h中,在其中加入类的成员声明:afx_msg void OnTest();
其次,在对应的MainFrame.cpp中,加入消息映射:ON_COMMAND(ID,OnTest)   这个就实现了一个ID对应的相应函数的。
最后,编写实际的函数,也是在MainFrame.cpp中,加入实现的函数。

实际上,此步骤,也即使编辑器为我们做的,我们平时在添加空间,消息中进行的一个个自动操作,编辑器都为我们自动生成了想要的代码,完成了

这种映射,只是,有时候我们无法完成撤销操作,也是由于添加的代码太过庞大繁杂罢了。

posted on 2010-02-11 16:44 deercoder 阅读(851) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理