1、 标记弹出菜单:
GetMenu():获得指向窗口的指针;
GetSubMenu(int nPos):指向CMenu对象弹出菜单的指针,nPos为弹出菜单的位置
CheckMenuItem(UINT nIDCheckItem, UINT nCheck):标记或取消弹出菜单;nIDCheckItem为被标识的菜单,nCheck表示如何标记菜单及如何表示弹出菜单位置
示例:GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
新建菜单被标识了。CheckMenuItem()也可以用控件ID来标识,nCheck为MF_BYCOMMAND
如图1
2、设置菜单项字体为粗字体:
SetDefaultItem( UINT uItem, BOOL fByPos = FALSE );
uItem为新菜单的位置,fByPos为区域句柄,fByPos = FALSE设置无效
示例:GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);//设置第一个子菜单页的第三个选项为粗字体
如图2
3、 为菜单项添加图形标记:
BOOL LoadBitmap( LPCTSTR lpszResourceName );// lpszResourceName为指向位图名字的字符串常量指针
BOOL LoadBitmap( UINT nIDResource );// nIDResource位图资源的ID号
BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );// 1)、nPosition为菜单项位置
2)、nFlags= MF_BYCOMMAND时,nPosition为菜单项的ID,nFlags= MF_BYPOSITION时,nPosition为菜单项的索引。
3)、pBmpUnchecked为菜单项以前用的位图,pBmpChecked为新加载位图
示例:
m_bitmap.LoadBitmap(IDB_BITMAP1);//载入位图
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,NULL,&m_bitmap);//用位图标记第一个子菜单项的第一个菜单
m_bitmap2.LoadBitmap(IDB_BITMAP2); //载入位图
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(1,MF_BYPOSITION,NULL,&m_bitmap2);//用位图标记第一个子菜单项的第二个菜单
设计位图的时候,需将位图压缩为13x13,否则在菜单中无法显示位图。
如图3
4、 设置菜单项不可选,即设置菜单项为灰色不可操作:
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );
nIDEnableItem:表示需要操作的菜单项
nEnable:可选值为
1)、MF_BYCOMMAND 第一个参数用ID号表示
2)、MF_BYPOSITION 第一个参数用菜单所在位置表示
3)、MF_DISABLED 菜单不可用
4)、MF_ENABLED 菜单可用
5)、 MF_GRAYED 菜单变灰
示例:GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);//设置第一个菜单页的第二个菜单项为灰色,不可选
如图4:
5、 单击菜单使菜单栏消失:
添加菜单响应函数SetMenu(CMenu* pMenu),pMenu为NULL则菜单栏消失。
菜单生效/无效:
为菜单项添加CN_UPDATE_COMMAND_UI的消息响应函数,代码如下:
if(ID_FILE_NEW==pCmdUI->m_nID)
pCmdUI->Enable(FALSE);//令ID无效,Enable(TRUE)为有效
6、 鼠标右键按下弹出菜单项:
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );
1)、nFlags:弹出菜单的位置
2)、x:弹出菜单的水平位置
3)、y:弹出菜单的垂直位置
4)、pWnd:弹出菜单的拥有者
5)、lpRect:包含矩形坐标的RECT结构体指针
示例:
void CCMenu_7View::OnRButtonDown(UINT nFlags, CPoint point) //添加鼠标右键按下消息
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point); //坐标换算
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
this);
CView::OnRButtonDown(nFlags, point);
}
右键弹出菜单还可以这样做:选择【project】->【Add to Project】->【component and controls】->【Visual c++ component】->【Pop-up】