基于文档的MFC项目中 系统菜单设置check

来源:互联网 发布:百度大数据产品 编辑:程序博客网 时间:2024/05/17 11:04


为了实现上面两幅图片中所示的菜单的check效果,需要为“子菜单1-1”“子菜单1-2”等check菜单追加事件处理程序,步骤如下:

1、在资源文件中,选中要追加事件处理程序的菜单项,点击右键,选中“添加事件处理程序”。弹出的窗口中,消息类型选择“COMMAND”,类列表中选择“CMainFrame”,点击添加编辑。追加了事件处理程序的菜单项处于Enable状态,没有追加的处于Disable状态。



2、VS会自动跳转到MainFrame.cpp文件中响应的消息函数里面。下面就要开始添加代码了。

首先,获取菜单的check状态。可以使用以下两个函数:(都是CMenu类的成员函数)

UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck);

UINT GetMenuState(UINT nID, UINT nFlags) const;

设置菜单状态:(就是上面提到的函数)

UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck);

对于nCheck,有以下两种选择:

MF_BYCOMMAND :则nIDCheckItem为ID

MF_BYPOSITION : 则nIDCheckItem为菜单项相对于父菜单的位置索引。


以下两段代码设置check状态都是对的:

a> void CMainFrame::On1111()
{
CTestMenuApp *app = (CTestMenuApp *)AfxGetApp();
UINT uStatus = GetMenu()->CheckMenuItem(ID_11_11, MF_BYCOMMAND);
if (uStatus == MF_CHECKED)
{
GetMenu()->CheckMenuItem(ID_11_11, MF_BYCOMMAND | MF_UNCHECKED);//取消标记
app->DisplayOriginFlag = false;
}
else if (uStatus == MF_UNCHECKED)
{
GetMenu()->CheckMenuItem(ID_11_11, MF_BYCOMMAND | MF_CHECKED);//标记
app->DisplayOriginFlag = true;
}
GetActiveView()->GetDocument()->UpdateAllViews(NULL);//更新视图
}

b>void CMainFrame::On1111()
{

static BOOL bIsChecked = false;
UINT uStatus = GetMenu()->GetSubMenu(4)->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION);
uStatus =  GetMenu()->GetSubMenu(4)->CheckMenuItem(ID_11_11, MF_BYCOMMAND);
if (uStatus == MF_CHECKED)
{
GetMenu()->GetSubMenu(4)->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_UNCHECKED);//取消标记
app->DisplayOriginFlag = false;
}
else if (uStatus == MF_UNCHECKED)
{
GetMenu()->GetSubMenu(4)->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);//标记
app->DisplayOriginFlag = true;
}

GetActiveView()->GetDocument()->UpdateAllViews(NULL);//更新视图
}


关于菜单的位置索引:

对于菜单栏的子菜单,由左至右从0开始索引。
对于特定的子菜单的菜单项,由上至下建立从0开始的索引。(转自菜单结构)

如下图:




0 0
原创粉丝点击