CMenu(菜单):
下面我们来实现几种样式的菜单:
样式1:在菜单栏上添加菜单(普通菜单),并添加消息响应
样式2:check菜单(对号)
样式3:位图菜单(替代文字)
样式4:位图标记的check菜单
样式5:右键菜单
样式6:动态添加菜单
别看有那么多,其实很简单,下面我们分别来实现:
样式1菜单:
在资源视图的MENU资源上打开资源,在后面添加一个菜单项即可,你懂的
然后在该菜单项上右键选择“添加事件处理程序”(VS2010),选择COMMAND消息即可
就这样,样式1搞定
样式2菜单:
和样式1一样,然后添加两个消息:command消息和update_command_ui消息:
如下处理:
void CMainFrame::OnPopularmenu()
{
// TODO: 在此添加命令处理程序代码
m_bCheckPopMenu=!m_bCheckPopMenu;
MessageBox("普通按钮单击");
}
void CMainFrame::OnUpdatePopularmenu(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->SetCheck(m_bCheckPopMenu);
}
好了,样式2搞定。
样式3:菜单:
当然先要添加一个菜单
添加变量:
CBitmap m_bitmap;
在OnCreate消息里处理创建:
m_bitmap.LoadBitmap(IDB_BITMAP2); //加载位图
CMenu *pMenu = GetMenu(); //获得菜单指针
//修改“位图菜单”->“菜单一”为位图菜单
pMenu->GetSubMenu(5)->ModifyMenu(ID_BMPMENU_BMPMENU, MF_BYCOMMAND,ID_BMPMENU_BMPMENU, &m_bitmap);//这里的5是我自己的按钮在菜单//资源上的项序号,从0开始。
搞定。
样式4菜单:
先添加一个菜单
添加变量:
CBitmap m_bitmap1;
CBitmap m_bitmap2;
在OnCreate消息里处理创建:
m_bitmap1.LoadBitmap(IDB_BITMAP2); //加载位图
m_bitmap2.LoadBitmap(IDB_BITMAP3);
CMenu *pMenu = GetMenu(); //获得菜单指针
pMenu->GetSubMenu(5)->SetMenuItemBitmaps(1,MF_BYPOSITION,&m_bitmap1,&m_bitmap2);
好了,现在处理消息:
和上面一样,添加两个消息:(command和update_command_ui消息):
void CMainFrame::OnBmpmenuBmpmenu2()
{
// TODO: 在此添加命令处理程序代码
m_bCheckMenuClick=!m_bCheckMenuClick;
MessageBox("位图菜单2单击!");
}
void CMainFrame::OnUpdateBmpmenuBmpmenu2(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->SetText("bmp menu");
pCmdUI->SetCheck(m_bCheckMenuClick);
}
又搞定了。
样式5菜单:
先在view类添加消息:WM_RBUTTONUP:
void CMyView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//MessageBox("OnLButtonUp");
static BOOL IsLoad=TRUE;
if (IsLoad)
{
m_PopMenu.LoadMenu(MAKEINTRESOURCE(IDR_MENU1));
}
IsLoad=FALSE;
CRect rect;
rect.left=point.x;
rect.top=point.y;
ClientToScreen(&rect);
m_PopMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,rect.left,rect.top,this,NULL);
CView::OnLButtonUp(nFlags, point);
}
又搞定了。
样式6菜单:
首先我们要打开资源视图,在字符串表中添加一个字符串ID为:IDM_ACTION
然后我们添加一个消息:WM_RBUTTONUP:
void CMyView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static BOOL lb_Check=FALSE;
if (lb_Check==FALSE)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu(); //得到主框架菜单
//pMenu->GetSubMenu(2)->AppendMenu(MF_SEPARATOR); //添加菜单分隔符
pMenu->GetSubMenu(2)->AppendMenu(MF_STRING, IDM_ACTION_MENU, "动态菜单(&A)"); //添加菜单
MessageBox("添加菜单到“查看”菜单下成功", "信息提示", MB_OK); //提示信息
}
if (lb_Check==TRUE)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
pMenu->GetSubMenu(2)->DeleteMenu(2,MF_BYPOSITION);
MessageBox("删除菜单成功", "信息提示", MB_OK);//提示信息
}
lb_Check=!lb_Check;
CView::OnRButtonUp(nFlags, point);
}
Ok,menu is over.