▲菜单的ID
每个菜单项都有唯一的ID,分隔栏和弹出菜单没有ID
Pop-up菜单(弹出菜单)项不能自定义消息响应
▲菜单的索引
菜单上从左至右,弹出菜单的索引依次是0,1,2...
子菜单中从上至下,菜单项(包括分隔栏)的索引依次是0,1,2...
▲获取菜单
GetMenu()
▲添加/删除菜单
CMenu menu //创建菜单对象
menu.LoadMenu(...) //初始化菜单对象
SetMenu(...) //添加或删除菜单
在添加菜单时,若menu是局部变量,应执行menu.Detach()
▲获取子菜单
menu=GetMenu() //获得菜单
GetMenu.GetSubMenu(...) //按索引号从菜单中获取子菜单
▲标记菜单项
GetMenu()->GetSubMenu(...)->CheckMenuItem(...) //在指定菜单项前显示或隐藏标记(默认为√)
///
CBitmap bitmap //创建位图对象
bitmap.LoadBitmap(...) //初始化位图对象
GetMenu()->GetSubMenu(...)->SetMenuItemBitmaps(...&bitmap...) //将指定菜单项的标记符号和非标记符号设置为指定的位图
系统规定的位图尺寸由GetSystemMetrics(SM_CXMENUCHECK)和GetSystemMetrics(SM_CYMENUCHECK)获得,图标透明色为白色
///
▲缺省菜单项
GetMenu()->GetSubMenu(...)->SetDefaultItem(...) //将指定菜单项以粗体显示
每个子菜单中只能有一个缺省菜单项
▲启用/禁用菜单项/子菜单
GetMenu()->EnableMenuItem(...) //启用或禁用指定的子菜单
GetMenu()->GetSubMenu(...)->EnableMenuItem(...) //启用或禁用指定的菜单项
对菜单项操作时,需要在CMainFrame类的构造函数中写入m_bAutoMenuEnable=false
▲通过CCmdUI设置菜单项
在类向导中,添加相应菜单项的UPDATE_COMMAND_UI消息响应函数,在响应函数中通过操作传入的CCmdUI对象指针,也可以设置对应菜单项的启用/禁用、标记/非标记、文字等。
▲添加/插入弹出菜单/菜单项
CMenu menu
menu.CreateMenu() //创建空菜单
GetMenu()->AppendMenu(MF_POPUP,menu.m_hMenu,"...") //添加指定文字的弹出菜单到菜单末尾
//
GetMenu()->GetSubMenu(...)->AppendMenu(MF_STRING,101,"...") //在指定的子菜单末尾添加指定文字的菜单项
/
GetMenu()->InsertMenu(...,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,"...") //在指定的弹出菜单前插入指定文字的弹出菜单
/
GetMenu()->GetSubMenu(...)->InsertMenu(...,MF_BYPOSITION|MF_STRING,101,"...") //在指定子菜单的指定菜单项前插入指定文字的菜单项
▲删除弹出菜单/菜单项
GetMenu()->DeleteMenu(...) //删除指定的弹出菜单
GetMenu()->GetSubMenu(...)->DeleteMenu(...) //删除指定的菜单项
▲刷新菜单
当窗口创建完成后,对菜单添加或删除子菜单时,需要刷新菜单
DrawMenuBar()
▲鼠标弹出式菜单
通过组建添加:工程->添加工程->Components and Controls->Visual C++ Components->Pop-up Menu,在弹出的对话框中选择目标类,设置菜单资源ID。
该组建在资源中添加了一个菜单资源,在目标类中添加成员函数OnContextMenu(...)
//
通过代码添加:
1.自建一个菜单资源
2.在目标类中添加WM_RBUTTONDOWN消息响应函数
3.在响应函数中
CMenu menu
menu.LoadMenu(...) //初始化菜单对象
CMenu* popmenu
popmenu=menu.GetSubMenu(...) //获得指定的子菜单
popmenu->TrackPopupMenu(...) //以指定的方式在指定的位置弹出指定的子菜单
TrackPopupMenu()使用的坐标是相对与整个屏幕,用ClientToScreen(...)将相对于客户区的坐标转换成相对于整个屏幕的坐标