主要介绍两种比较简单和常用的创建方法。
一、在资源视图中添加菜单资源,通过鼠标点击添加菜单项
菜单栏设计好,以后就是添加了。介绍两种方法:
1、很简单,鼠标右击想显示菜单栏的对话框属性,可以看到有一个menu的属性,点击就会出现你已经设计好的菜单栏的资源ID,选中就好了。点击运行,就可以看到菜单栏。
2、首先定位到你想显示菜单栏对话框的OnInitDialog()函数处,在其函数体里添加如下代码:
CMenu menu;
menu.LoadMenuW(IDR_MENU1);//加载资源菜单栏,IDR_MENU1为资源视图里菜单的ID
this->SetMenu(&menu); //这个函数将当前菜单设为指定的菜单。
//它使窗口被重画以反映菜单的变化。参数必须是指针型的。
menu.Detach();// 窗口销毁时,局部变量menu同时销毁
二、通过输入代码显示菜单栏
要熟悉几个CMenu()的函数
BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
hMenu:将被修改的菜单条、下拉式菜单、子菜单、或快捷菜单的句柄。
UFlags:控制新菜单项的外观和性能的标志。此参数可以是备注里所列值的组合。
UIDNewltem:指定新菜单项的标识符,或者当uFlags设置为MF_POPUP时,表示下拉式菜单或子菜单的句柄。
LpNewltem:指定新菜单项的内容。
BOOL InsertMenu(UINt uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
uPosition:指定新菜单项将被插入其前面的菜单项,其含义由参数uFlagS决定。
uFlags:指定控制参数uPosition的解释的标志、新菜单项的内容、外观和性能。此参数必须为下列值之一和列于备注里的一个值的组合。
uIDNewltem:指定新菜单项的标识符,或者当参数uFlags设置为MF_POPUP时,指定下拉式菜单或子菜单的句柄。
LpNewltem:指定新菜单项的内容。其含义依赖于参数UFlags是否包含标志MF_BITMAP,MF_OWNERDRAW或MF_STRING。
熟悉几个nFlags标识符
MF_CHECKED:命令旁显示默认复选标志
MF_UNCHECKED:清除命令旁的复选标志
MF_DISABLED:禁止此菜单命令,但是不变灰显示
MF_ENABLED:允许此菜单命令,恢复到正常状态
MF_GRAYED:禁止此菜单命令,变灰显示
MF_MENUBARBREAK:对于静态菜单,放到新行;对于弹出菜单,放到新栏 中,栏间有分隔线
MF_MENUBREAK:对于静态菜单,放到新行;对于弹出菜单,放到新栏,栏间无分隔线
MF_OWNERDRAW:指定该命令是自画式菜单命令
MF_POPUP:指定该菜单命令有一个关联的弹出式菜单,即标准菜单,点击是显示其子菜单
MF_SEPARATOR:画一条水平分隔线,只用于弹出式菜单。
MF_STRING:指定此菜单命令是一个字符串 ,一般菜单可以设置响应函数。
定位到你想显示菜单栏的对话框的OnInitDialog()函数处,在其函数体里添加如下代码:
CMenu menu;
menu.CreateMenu();
menu.AppendMenuA(MF_POPUP,(UINT)menu.m_hMenu,"文件");
menu.AppendMenuA(MF_POPUP,(UINT)menu.m_hMenu,"编辑");
menu.InsertMenuA(2,MF_POPUP,(UINT)menu.m_hMenu,"视图");
//此时在菜单的第三项插入菜单
//AppendMenuA()和InsertMenu()区别是,前一个函数总是默认的在菜单栏后面
//插入菜单,而第二个函数可以在任意位置通过改变uPosition
menu.GetSubMenu(0)->AppendMenuA(MF_STRING,111,"打开");
//给菜单栏的第一个菜单添加子菜单,菜单栏默认计数从0开始的
menu.GetSubMenu(0)->AppendMenuA(MF_SEPARATOR);
//在“打开”后面添加了一个分隔符,
menu.GetSubMenu(0)->AppendMenuA(MF_STRING,111,"关闭");
this->SetMenu(&menu);
menu.Detach();
最后设置一般菜单项的响应函数:
在资源头文件添加#define IDM_MM2 111;就可以将 menu.GetSubMenu(0)->AppendMenuA(MF_STRING,111,"关闭");改写为 menu.GetSubMenu(0)->AppendMenuA(MF_STRING,IDM_MM2,"关闭");
在当前对话框的头文件里添加一个点击菜单的响应函数例如ONMM2();
关联MFC 中用的是ON_COMMAND(IDM_MM2,ONMM2),注意这句话后面不加“;”的。
例如下面的添加:
BEGIN_MESSAGE_MAP(CasdDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
//当我们是手动添加时,就在下面不要添加到上面语句当中,如果添加到上面可能会出现一些莫名的错误。
ON_BN_CLICKED(IDC_BUTTON2, &CasdDlg::OnBnClickedButton2)
ON_COMMAND(IDM_MM1,OnMM1)
END_MESSAGE_MAP()
然后编写函数ONMM2()的代码就可以了。