添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

主要介绍该如何加载菜单栏、工具栏,如何改变菜单栏的文字,如何实现菜单栏Checked的勾选效果。

菜单栏/工具栏的创建

“资源视图”内选择“添加资源”,再在弹出的对话框中选择“Menu”再“新建”,菜单栏创建完毕。
之后就可以根据自己的需求,是要建立菜单栏还是工具栏。
在这里插入图片描述
往下创建设置为菜单栏,往右延伸为工具栏。
在这里插入图片描述

添加菜单栏/工具栏

作为菜单栏:
在鼠标点击的位置创建菜单栏

void CMenuTestDlg::OnRButtonUp(UINT nFlags, CPoint point)
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CMenu				Menu;
	CMenu				*pSubMenu;
	CPoint				p;
	//建立复制菜单
	GetCursorPos(&p);
	Menu.LoadMenu(IDR_MENU1);
	pSubMenu = Menu.GetSubMenu(0);
	pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this);
	Menu.Detach();
	Menu.DestroyMenu();
	CDialogEx::OnRButtonUp(nFlags, point);

作为工具栏:
代码实现的方式是类似的,只要在OnInitDialog()函数内初始化即可。
除了代码实现以外,还可通过配置选项简单实现。
只需要在“属性”内添加你创建好的工具栏即可,通过这种方法有个优点:不会影响对话框的Size,而通过代码添加的工具栏会影响到对话框的size。
假设一个对话框内可视区域的宽为200,工具栏宽度为10。通过代码添加,会导致工具栏是在可视区域内被创建,200的像素有10像素已经被工具栏占用;通过属性栏添加,工具栏是在可视区域以外加入工具栏,不会占用对话框本身的200像素。这种情况在OnSize()函数内影响较大。
在这里插入图片描述

工具栏前勾选效果

效果图:
在这里插入图片描述
代码实现:
方法一:

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:Menu菜单栏勾选框设置
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuCheckSet(UINT MenuID, bool bCheck)
	if (bCheck)
		//MF_BYCOMMAND 
		GetMenu()->CheckMenuItem(MenuID, MF_BYCOMMAND | MF_CHECKED);
		GetMenu()->CheckMenuItem(MenuID, MF_BYCOMMAND | MF_UNCHECKED);
//创建对应的菜单选项响应函数
void CMenuTestDlg::OnOptionTest()
	static bool bStatus;
	bStatus = !bStatus;
	// TODO: 在此添加命令处理程序代码
	MenuCheckSet(ID_OPTION_TEST, bStatus);

方法二:
根据菜单选项的位置来实现勾选效果

void CMenuTestDlg::OnOptionTest()
	CMenu*				pMenu;
	static bool			bStatus = false;
	bStatus = !bStatus;
	//“测试项”菜单在工具栏的第二个位置(从0算起则为1)
	//定位到“测试项”所在菜单的第几列
	pMenu = GetMenu()->GetSubMenu(1);
	if (bStatus)
		//0表示“测试项”位于“工具”的第一个选项(从0算起)
		//MF_BYPOSITION 
		pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);
		pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_UNCHECKED);

菜单文本动态调整

关键函数为ModifyMenu()

void CMenuTestDlg::OnOptionTest()
	CMenu*				pMenu;
	CString				str;
	static bool			bStatus = false;
	bStatus = !bStatus;
	//“测试项”菜单在工具栏的第二个位置(从0算起则为1)
	//定位到“测试项”所在菜单的第几列
	pMenu = GetMenu()->GetSubMenu(1);
	if (bStatus)
		str.Format(_T("选中"));
		//pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);
		str.Format(_T("未选中"));
		//pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_UNCHECKED);
	//改变选项文本
	pMenu->ModifyMenu(0, MF_BYPOSITION | MF_STRING, ID_OPTION_TEST, str);

这边再分享两个自己写的使能和禁用菜单栏的函数。

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:使能 Menu菜单栏
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuOptionEnable(UINT MenuID)
	GetMenu()->EnableMenuItem(MenuID, MF_BYCOMMAND | MF_ENABLED );//使能可被选择
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:禁用 Menu菜单栏
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuOptionDisable(UINT MenuID)
	GetMenu()->EnableMenuItem(MenuID, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);//不能被选择且变灰	
                                    用鼠标点击菜单按钮弹出主菜单,选择子菜单时图标符号由感叹号实时改为打钩图标。选中的子菜单序号保存在windows目录下的应用程序名称.ini文件中,下次运行程序时出现的是最后一次选择的打钩图标子菜单。
       BOOL LoadMenu(UINT nIDResource);
       加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,否则返回FALSE。
这个篇文章说的很好,但是有个地方折腾了好久了
m_menu = GetMenu()->GetSubMenu(1);需要在初始化界面的地方获取指针,然后后面使用,否则总是抛出异常;
SetMenuItemBitmaps//设置菜单项左边的位图
函数定义:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
nPostion
在对话框窗口里显示菜单栏工具栏一样,菜单栏在按件面板里没有对应的选项,但有一个菜单控件类CMenu,所以如果想要在对话框里显示菜单栏,就得像工具栏那样,
一、将Menu加入Resource视图中
在WorkSpace中的Resource视图下,在任意一个文件夹图标上,右击选择Insert(插入)选项,在弹出的对话框中选择Menu以后,再点击,new按钮,菜单就会添加成功了,但是现在还没有完成,还不能进行编译,因为现在的菜单时空的,在编译的时候会被清除的。
二、用菜单编辑器添...
新加一个选项text,右键选择添加事件,选择command命令,选择view类,编辑代码就可以了
2.子菜单勾选
//GetMenu()->GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION | MF_CHECKED);0,2代表第一个菜单项下第三个选项设置为对勾
	//GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMA
                                    我正在编写一个程序,除其他外,需要右键单击显示上下文菜单。我正在陷入WM_NOTIFY,被点击的控件的标识符,以及NM_RCLICK。这一切都很好。问题出现在我正在处理该右键单击时:case NM_RCLICK:{HMENU Popup = LoadMenu(0, MAKEINTRESOURCE(IDR_NED_MENU));if ( !Popup ) {DWORD err = GetLastEr...