找不到idr_menu1_MFCCMenu实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整...

【MFC】CMenu实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整

说明

菜单栏/工具栏的创建

添加菜单栏/工具栏

工具栏前勾选效果

菜单文本动态调整

其他

说明

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值