1)创建MFC项目;

2)在资源视图中,右键点击"XXX.rc"目录,选择弹出菜单的“添加资源”选项,在弹出的对话框中选择添加menu;

3)在资源界面中输入菜单的各个指令项的文字内容,并且设置对应的ID号;

4)在对话框的类视图中,选择“属性”-“消息”,重写对消息WM_CONTEXTMENU的响应函数。

5)函数体内填写代码如下:

void CtestMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{// TODO: 在此处添加消息处理程序代码CMenu menu;menu.LoadMenu(IDR_MENU1);CMenu * pMenu;pMenu = menu.GetSubMenu(0);pMenu->EnableMenuItem(ID_32771, MF_BYCOMMAND|MF_ENABLED);pMenu->EnableMenuItem(ID_32772, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);pMenu->Detach();menu.DestroyMenu();
}

6)为了让用户选择的指令能够起作用,还要在对话框的cpp文件中添加菜单指令与响应函数的关联:

ON_COMMAND(ID_32772, &CtestMenuDlg::OnSaveBaseImg)
ON_COMMAND(ID_32771, &CtestMenuDlg::OnCompareImg)

7)还要在h文件里声明OnSaveBaseImg()和OnCompareImg()两个函数,并在cpp文件里声明。下面把头文件和cpp文件列出来:

// testMenuDlg.h : 头文件
//#pragma once// CtestMenuDlg 对话框
class CtestMenuDlg : public CDialogEx
{
// 构造
public:CtestMenuDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_TESTMENU_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnSaveBaseImg();afx_msg void OnCompareImg();afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/);
//  afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
};
// testMenuDlg.cpp : 实现文件
//#include "stdafx.h"
#include "testMenu.h"
#include "testMenuDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CtestMenuDlg 对话框CtestMenuDlg::CtestMenuDlg(CWnd* pParent /*=NULL*/): CDialogEx(CtestMenuDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CtestMenuDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CtestMenuDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_CONTEXTMENU()ON_COMMAND(ID_32772, &CtestMenuDlg::OnSaveBaseImg)ON_COMMAND(ID_32771, &CtestMenuDlg::OnCompareImg)
END_MESSAGE_MAP()// CtestMenuDlg 消息处理程序BOOL CtestMenuDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);         // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CtestMenuDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CtestMenuDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtestMenuDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CtestMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{// TODO: 在此处添加消息处理程序代码CMenu menu;menu.LoadMenu(IDR_MENU1);CMenu * pMenu;pMenu = menu.GetSubMenu(0);pMenu->EnableMenuItem(ID_32771, MF_BYCOMMAND|MF_ENABLED);pMenu->EnableMenuItem(ID_32772, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);pMenu->Detach();menu.DestroyMenu();
}void CtestMenuDlg::OnSaveBaseImg()
{}void CtestMenuDlg::OnCompareImg()
{int a = 0;a = a + 1;
}

效果:

由于EnableMenuItem()的作用,第二条指令没有被激活。点击“变化检测”选项,触发函数OnCompareImg()的断点,说明菜单与响应函数确实建立了关联。

MFC添加鼠标右键菜单相关推荐

  1. WinForm -- 为TextBox文本框添加鼠标右键菜单

    WinForm -- 为TextBox文本框添加鼠标右键菜单 1. 新建一个WinForm项目,放置一个TextBox控件 2. 从工具箱拖进来一个ContextMenuStrip 3. 将TextB ...

  2. Mac OS X下删除或添加鼠标右键菜单项目及清除Mac OS右键菜单重复项

    一.Mac OS X下删除或添加鼠标右键菜单项目 1. 打开 Finder,点击屏幕顶部菜单栏的 "前往",在下拉菜单里选择 "前往文件夹-" 2. 在弹出的输 ...

  3. Silverlight 4.0添加鼠标右键菜单和Silverlight全屏模式的进入退出

    说明:本文出处:http://www.cnblogs.com/chengxingliang/archive/2011/02/14/1954399.html#2627673(非常感谢) 在实际应用中,我 ...

  4. Leaflet中使用Leaflet.contextmenu插件实现地图上添加鼠标右键菜单

    场景 Leaflet快速入门与加载OSM显示地图: Leaflet快速入门与加载OSM显示地图_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面的基础上,怎样使用Leaflet.co ...

  5. TortoiseSVN添加鼠标右键菜单

    TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录. 从http://tortoisesvn.net/downloads.html下载对应 ...

  6. 绿色版软件怎么添加鼠标右键菜单里

    win+R 输入RegEdit 运行,进入注册表编辑器 在HKEY_CLASSES_ROOT 项的 shell项下,新建exe的软件名的项 双击默认,修改数值为 exe的软件名 在以<exe的软 ...

  7. VB添加IE右键菜单等

    /-------------------------------------------------- '*************************************** 'IE工具栏按 ...

  8. openlayer右键菜单_使用OpenLayers3 添加地图鼠标右键菜单

    添加右键菜单,首先我们要监听鼠标右键点击的操作,我们知道鼠标右键事件名是 contextmenu,当鼠标在 html 元素之上,点击鼠标右键,便会触发 contextmenu 事件,在 context ...

  9. win10计算机添加右键菜单,win10系统如何对鼠标右键菜单进行手动管理和添加

    当鼠标右击文件时,有没有发现冗长的上下文菜单,实在令人讨厌.很多软件在安装后会在右键中添加一些右键菜单,尤其是显卡选项!这些菜单可以很便捷地执行某一操作.但是,时间长了,右键菜单的项目就会增多,很不方 ...

  10. 将uglifyjs添加到鼠标右键菜单

    之前几天根据YUICompressor和TBCompressor整合到鼠标右键菜单自己将uglifyjs也添加到了右键菜单,下面简单记录下过程.效果如下 uglifyjs添加到鼠标右键菜单 配置win ...

最新文章

  1. 10个快速提升技术水平的方法
  2. 《高效程序员的45个习惯》-之一
  3. Android中Activity启动模式
  4. linux 的 grep 命令 和 ngrep 命令
  5. MyEclipse 7.0 用java代码生成序列号
  6. 维基解密:科技公司获得安全漏洞信息须答应几个条件
  7. 利用iMazing将iOS设备的录音文件拷贝到电脑
  8. 常见手机定位方式浅谈
  9. win32-x64-64\binding.node is not a valid Win32 application
  10. uboot源码修改之支持DM9000
  11. 金仓数据库KingbaseES数据库管理员指南--15.1. 管理视图
  12. C语言例题:温度转换
  13. 《通关!游戏设计之道》给游戏编个故事
  14. 计算机硬件介绍之CPU与多线程
  15. Kronecker(克罗内克积)积
  16. Elasticsearch 中为什么选择倒排索引而不选择 B 树索引
  17. python基_python之地基(一)
  18. xinxin - 初步学习tkinter
  19. 阿里测试开发python面试题_[阿里面试]测试开发工程师面试
  20. 【致远FAQ】Guest 账号同时多人登陆导致OA卡顿

热门文章

  1. 电脑开关电源维修图解
  2. socket网络通信实现与优化
  3. 通俗的解释云计算 公有云 私有云 混合云
  4. 学会它,能让你工作学习效率提升10倍!
  5. VScode输入英文感叹号!没有提示模板!!
  6. CVPR 2022 | 谷歌提出mip-NeRF 360:全景NeRF越来越丝滑!
  7. 网络流(4)——带有容量的顶点和二部匹配
  8. ArcGIS遇到严重的应用程序错误的解决办法
  9. winword.exe应用程序错误0xc0000142
  10. vue3.0组合式api语法使用总结