您的位置:首页 > 其它

动态建立右键菜单(一级/二级/三级) 响应鼠标单击事件及修改项的内容

2007-04-02 14:13 856 查看
之前刚学习MFC的时候,啥也不懂,连一个MessageBox都看不懂,呵呵……,今天刚开博客,这也是我的第一篇文章,右键菜单的动态建立。就像一些大侠说的一样,其实方法都一样,看你能不能想得到,能不能触类旁通。

1.定义CMenu的对象

CMenu menu1, *menu2, *menu3;
 POINT curPos;

2.创建一级弹出菜单

 menu1.CreatePopupMenu();
 SetForegroundWindow();
 // 创建右键菜单一级子目录
 menu1.AppendMenu(MF_POPUP, (UINT)menu1.m_hMenu,    "菜单");
 menu1.AppendMenu(MF_STRING|MF_ENABLED, IDC_MENU1, "菜单1");
 menu1.AppendMenu(MF_STRING|MF_ENABLED, IDC_MENU2,   "菜单2");

这时[菜单1]与[菜单2]只是在一级菜单中,而[菜单]项则是一个没有下级菜单的空项.

3.根据BOOL变量来控制是否选中该项

刚开始建立菜单的时候可以设置它的初始状态,比如初始状态未选中,当右键单击该项的时候,

改变布尔变量的值,下次再弹出菜单的时候就会根据变量的值重新建立一个新的右键菜单;

相反,下次单击的时候又会根据这个变量来建立无勾的右键菜单(具体的事件响应在后面做介绍).

 if(m_control)  menu1.CheckMenuItem(IDC_MENU1, MF_BYCOMMAND|MF_CHECKED);
 else  menu1.CheckMenuItem(IDC_MENU1, MF_BYCOMMAND|MF_UNCHECKED);

4.此处根据变量值来控制文本内容,也就是通过变量来改变MENU项的内容

menu1.AppendMenu(MF_STRING|MF_ENABLED, IDC_RWFULLSCREEN, "全屏");
 if(!m_fullscreen)  menu1.AppendMenu(MF_STRING|MF_ENABLED, IDC_RWFULLSCREEN, "全屏");
 else  menu1.AppendMenu(MF_STRING|MF_ENABLED, IDC_RWFULLSCREEN, "恢复");

5.创建二级子目录

   //创建右键菜单二级子目录
  menu2 = menu1.GetSubMenu(0);           //0--一级菜单中"菜单"项
   menu2->AppendMenu(MF_POPUP, (UINT)menu2->m_hMenu, "测试");

6.创建右键三级子目录

 //创建右键菜单三级子目录

#define IDC_RWTEMP 20000
     menu3 = menu2->GetSubMenu(0);               //0--二级菜单中的"测试"项
     menu3->AppendMenu(MF_STRING|MF_ENABLED, IDC_RWTEMP, "测试完了");
 7.创建好后就把它显示出来,并记录当前选中的项

::GetCursorPos(&curPos);
  nSelection = menu1.TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN|TPM_BOTTOMALIGN|
       TPM_NONOTIFY|TPM_RETURNCMD, curPos.x, curPos.y, this);

 8.此时就可以响应鼠标事件了,主要还是根据所建立的ID来确定是选中了哪一项

if(nSelection == 20000)  MessageBox("测试完了");

9.测试完了不要忘记把它们释放掉

 menu1.DestroyMenu();

menu2->DestroyMenu();

 menu3->DestroyMenu();
 

其实还有其它的方法来动态给某一项打勾,判断是否选中,不过下面这种方法没测试过,

是一位网友发的,应该没问题.

CMenu m_menu;
m_menu.LoadMenu(IDR_MENU1);
CMenu *m_pMenu = m_menu.GetSubMenu(0);

void CAaDlg::OnUpdateNihao(CCmdUI* pCmdUI)
{
//根据flag判断设置
m_pMenu ->CheckMenuItem(ID1,MF_CHECKED | MF_BYCOMMAND);//打勾
//或者设置
m_pMenu ->CheckMenuItem(ID1,MF_BYCOMMAND);//不打勾
}

再加几个关于右键菜单的链接

http://community.csdn.net/Expert/topic/5331/5331719.xml?temp=.3090631

http://community.csdn.net/Expert/topic/5408/5408740.xml?temp=.5233576

这是小弟的第一篇文章,欢迎大家多提意见,有什么问题请联系我.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  menu string 测试 mfc
相关文章推荐