6.3基本菜单操作

对于菜单来说,要访问某个菜单项,可以通过该菜单的标识ID,也可以通过位置索引。
对于子菜单来说,只能通过索引号进行访问,因为子菜单没有标识号。

6.3.1标记菜单

菜单栏->查看子菜单下面两个菜单项,前面都有一个对号。这种类型的菜单称为标记菜单。
为文件子菜单下面新建菜单项添加一个标记:
因为主菜单位于框架窗口,所以在框架窗口创建完成后再去访问菜单对象。在框架类OnCreate函数中添加代码实现该功能。

为获得文件子菜单下面的新建菜单项,首先获得程序的菜单栏,CWnd类的成员函数:GetMenu函数。
CMenu* GetMenu( ) const;
返回菜单栏对象的指针。

获得一个子菜单:GetSubMenu();
CMenu* GetSubMenu( int nPos ) const;
这个参数就是子菜单的索引号。返回子菜单的指针。

为子菜单的菜单项添加或者删除标记:CheckMenuItem函数
UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );
第一个参数:指定需要处理的菜单
第二个参数:怎样设置菜单项,如何定位该菜单项的位置。
第二个参数取值:
MF_BYCOMMAND:根据命令访问菜单项,第一个参数是菜单项的命令ID。
MF_BYPOSITION:根据位置访问菜单项,第二个参数是菜单项的索引号。
MF_CHECKED:添加复选标记。
MF_UNCHECKED:移走复选标记。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{.....
  GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
 return 0;
}

也可以用命令ID来访问:GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);

在这里插入图片描述

6.3.2默认菜单项

有些子菜单下面的菜单项是粗黑体表示,这就是默认菜单项。
设置一个默认菜单项:SetDefaultItem函数。
BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE );
第一个参数由第二个参数决定。
如果第二个参数是FALSE,第一个参数就是菜单项标识,否则就是位置索引。默认是菜单项标识。

将文件子菜单下面的打开菜单项设置为默认菜单项:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{.....
  GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
 GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
 return 0;
}

GetMenu()->GetSubMenu(0)->SetDefaultItem(4,TRUE);
打印菜单项并没有加黑加粗。这是由于分隔栏也占用索引位置,所以4应该改为5

一个子菜单只能有一个默认的菜单项

在这里插入图片描述

6.3.3图形标记菜单

菜单栏->查看->菜单项就是标记菜单
给菜单项前面加上图形:利用CMenu类的SetMenuItemBitmaps函数。
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
第一个参数由第二个参数决定的;第三个参数是取消状态时的位图;第四个参数是选中状态时的位图。

首先新建一个位图资源:IDB_MITMAP1。
然后框架类OnCreate函数中实现图形标记菜单。
因为位图要当作标记菜单来使用,要一直显示出来,所以不能作为局部变量来使用。因此把位图设置为框架类的CBitmap类型成员变量:m_bitmap

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{.....
  GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
 GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
 
 m_bitmap.LoadBitmap(IDB_BITMAP1);
 GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);
 return 0;
}

运行,发现文件新建菜单项前面没有位图标记,原因是位图太大了,只显示了位图的左上角空白部分。

GetSystemMetrics函数可以得到图形标记菜单上位图的尺寸。

int GetSystemMetrics(
  int nIndex   // system metric or configuration setting to retrieve
);

SM_CXMENUCHECK获得标记图形的宽度,SM_CYMENUCHECK获得标记图形的高度

在m_bitmap.LoadBitmap(IDB_BITMAP1);之前添加:

CString str;
str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
 MessageBox(str);

CString类提供一个名为Format的函数,将一定的格式的内容格式化,并将结果保存到str字符串中。
再将相关信息通过消息框显示出来,然后根据相关信息,将位图资源进行调整。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值