说明
主要介绍该如何加载菜单栏、工具栏,如何改变菜单栏的文字,如何实现菜单栏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);
}
else
{
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);
}
else
{
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);
}
else
{
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);//不能被选择且变灰
}