1.关于为毛要使用detach()函数

    CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach(); //如果不加这句,等着崩溃吧

detach就是把windows资源和C++对象分离开来,如果你不detach,由于menu对象是局部对象,退出函数后menu就自我销毁了。他的 析构函数会强迫销毁那个菜单系统资源,相当于调用诸如DeleteMenu(hMenu)之类的函数(注意区分C++对象和系统菜单对象),detach之后,c++对象还是会析构,但是系统资源则不会被销毁!

2.获取菜单ID

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
  ON_COMMAND(ID_32772,OnOpen)
END_MESSAGE_MAP() void CMainWindow::OnOpen(){
UINT nID=(UINT)LOWORD(GetCurrentMessage()->wParam);
CString s;
s.Format(_T("%d"),nID);
::AfxMessageBox(s);
}

3.一组连续命令ID

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
  ON_COMMAND_RANGE(AAA,BBB,OnOpen) //ID范围从AAA到BBB
END_MESSAGE_MAP() void CMainWindow::OnOpen(UINT nID){
CString s;
s.Format(_T("%d"),nID);
::AfxMessageBox(s);
}

 4.右键弹出式菜单

void CMdiView::OnRButtonDown(UINT nFlags, CPoint point)
{
CView::OnRButtonDown(nFlags, point); CMenu* menu_bar = AfxGetMainWnd()->GetMenu();
CMenu* file_menu = menu_bar->GetSubMenu();
ASSERT(file_menu); ClientToScreen(&point);
file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
point.y, this);
}

5.OnContextMenu和OnRButtonDown区别

当鼠标压下,鼠标弹起两个消息依次发生,才会发生OnContextMenu消息.
你在OnRButtonDown里用一个Message输出文字,则后面的鼠标弹起消息被MessageBox接受了.故OnContextMenu没有被调用. ------------------------------------------------------------------------------------------------- OnRButtonDown就是鼠标右键消息.
但 "ContextMenu "不一定是鼠标右键触发的. 比如按windows键盘上的属性键,或按shift+F10都是ContextMenu.
所以, 不要使用OnRButtonDown取代OnContextMenu void CMainWindow::OnContextMenu(CWnd* pWnd, CPoint point)
{
    
    CPoint pt=point;  
    CMenu menu;  
    CMenu* PopupMenu=NULL;  
 
    ScreenToClient(&pt);  
 
    //加载菜单  
    menu.LoadMenu(IDR_MAINFRAME);  
 
    PopupMenu=menu.GetSubMenu(1);  
    PopupMenu->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,point.x,point.y,this);  
}

MFC 菜单栏杂记的更多相关文章

  1. MFC中菜单栏使用

    1.新建项目: 选择MFC应用程序,应用程序类型选择“基于对话框”: 本文中项目名为:MenuTest 2.新建菜单栏资源: 找到资源视图,右键MenuTest.re选择“添加资源”——选择Menu, ...

  2. Visual studio C++ MFC之点击按钮(菜单栏)生成新窗口

    背景 当前做的APP有菜单栏,菜单栏有一项需要对下位机相关参数进行设置,则必须弹出一个窗口来实现设置操作.本篇即对点击菜单栏生成新的窗口,在新的窗口内完成相应计划后结束新窗口并返回原窗口的方法进行简述 ...

  3. 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)

    原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...

  4. MFC 学习 之 菜单栏的添加

    运行环境:vc++ 6.0    win81.通过资源 添加一组  菜单栏  如下: 2.在OnInitDialog()中添加如下代码: // Add "About..." men ...

  5. MFC中在基于对话框的窗体中使用CFileDialog导致菜单栏变灰的解决方案

    CSDN的博客编辑器实在是难用……转战博客园 直接把CSDN发的搬过来了 ————————————————————————————我是分割线———————————————————————————— 第 ...

  6. MFC的本质

    一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...

  7. MFC 工具栏隐藏与显示

    最近在学MFC,看的是孙鑫的VC++视频,感觉还不错.在看到第九节课的时候,讲到工具栏的时候,做了个小功能:工具栏的隐藏和显示,但是有个bug就是一个悬浮的工具栏隐藏后再显示,就会变成停靠状态.这里我 ...

  8. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

  9. VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

    首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...

随机推荐

  1. SimpleDateFormat函数语法

    SimpleDateFormat函数语法:         G 年代标志符         y 年         M 月         d 日         h 时 在上午或下午 (1~12)  ...

  2. N!含有多少个 2/5质因子

    编程之美127页,N!中含有质因数2的个数 = [N/2] + [N/4] + [N/8] + [N/16] + ..... 要理解上式,先看 编程之美126页,N!中含有质因数5的个数Z 举例:N ...

  3. opencv:创建滑动条

    函数原型: ,); #include <opencv.hpp> using namespace cv; #define WINDOW_NAME "线性混合示例" // ...

  4. 在SQL Server中快速删除重复记录

     在SQL Server中快速删除重复记录 2006-07-17 21:53:15 分类: SQL Server 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询 ...

  5. python基础之函数名称空间与作用域

  6. CSS样式:覆盖规则

    规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...

  7. windows 下多线程

    unsigned uiThread2ID; HANDLE handle = (HANDLE)_beginthreadex(NULL, , ThreadUploadFun, NULL, CREATE_S ...

  8. opencv 卡尔曼滤波器例子,自己修改过

    一.卡尔曼滤波器的理论解释 http://blog.csdn.net/lindazhou2005/article/details/1534234(推荐) 二.代码中一些随机数设置函数,在opencv中 ...

  9. win10 desktop.ini文件

    更新windows之后,桌面上突然多了一个隐藏文件desktop.ini,如下图所示: 这并不是病毒,而是一个配置文件.而且这个文件是系统保护文件,本应该是被隐藏的.可能以前个人用户设置的时候显示了系 ...

  10. NOIP模拟题 序列

    题目大意 给定长为$n$的序列$A$,定义长为$k$的区间中位数为从小到大排完序后第$\lfloor\frac{k}{2}\rfloor$个数的大小. 每次询问给定$l_1,r_1,l_2,r_2$有 ...