对于菜单来说,要访问某个菜单项,可以通过该菜单的标识ID,也可以通过位置索引。
对于子菜单来说,只能通过索引号进行访问,因为子菜单没有标识号。
菜单栏->查看子菜单下面两个菜单项,前面都有一个对号。这种类型的菜单称为标记菜单。
为文件子菜单下面新建菜单项添加一个标记:
因为主菜单位于框架窗口,所以在框架窗口创建完成后再去访问菜单对象。在框架类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);
有些子菜单下面的菜单项是粗黑体表示,这就是默认菜单项。
设置一个默认菜单项: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
一个子菜单只能有一个默认的菜单项
菜单栏->查看->菜单项就是标记菜单
给菜单项前面加上图形:利用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字符串中。
再将相关信息通过消息框显示出来,然后根据相关信息,将位图资源进行调整。