MFC添加鼠标右键菜单
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添加鼠标右键菜单相关推荐
- WinForm -- 为TextBox文本框添加鼠标右键菜单
WinForm -- 为TextBox文本框添加鼠标右键菜单 1. 新建一个WinForm项目,放置一个TextBox控件 2. 从工具箱拖进来一个ContextMenuStrip 3. 将TextB ...
- Mac OS X下删除或添加鼠标右键菜单项目及清除Mac OS右键菜单重复项
一.Mac OS X下删除或添加鼠标右键菜单项目 1. 打开 Finder,点击屏幕顶部菜单栏的 "前往",在下拉菜单里选择 "前往文件夹-" 2. 在弹出的输 ...
- Silverlight 4.0添加鼠标右键菜单和Silverlight全屏模式的进入退出
说明:本文出处:http://www.cnblogs.com/chengxingliang/archive/2011/02/14/1954399.html#2627673(非常感谢) 在实际应用中,我 ...
- Leaflet中使用Leaflet.contextmenu插件实现地图上添加鼠标右键菜单
场景 Leaflet快速入门与加载OSM显示地图: Leaflet快速入门与加载OSM显示地图_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面的基础上,怎样使用Leaflet.co ...
- TortoiseSVN添加鼠标右键菜单
TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录. 从http://tortoisesvn.net/downloads.html下载对应 ...
- 绿色版软件怎么添加鼠标右键菜单里
win+R 输入RegEdit 运行,进入注册表编辑器 在HKEY_CLASSES_ROOT 项的 shell项下,新建exe的软件名的项 双击默认,修改数值为 exe的软件名 在以<exe的软 ...
- VB添加IE右键菜单等
/-------------------------------------------------- '*************************************** 'IE工具栏按 ...
- openlayer右键菜单_使用OpenLayers3 添加地图鼠标右键菜单
添加右键菜单,首先我们要监听鼠标右键点击的操作,我们知道鼠标右键事件名是 contextmenu,当鼠标在 html 元素之上,点击鼠标右键,便会触发 contextmenu 事件,在 context ...
- win10计算机添加右键菜单,win10系统如何对鼠标右键菜单进行手动管理和添加
当鼠标右击文件时,有没有发现冗长的上下文菜单,实在令人讨厌.很多软件在安装后会在右键中添加一些右键菜单,尤其是显卡选项!这些菜单可以很便捷地执行某一操作.但是,时间长了,右键菜单的项目就会增多,很不方 ...
- 将uglifyjs添加到鼠标右键菜单
之前几天根据YUICompressor和TBCompressor整合到鼠标右键菜单自己将uglifyjs也添加到了右键菜单,下面简单记录下过程.效果如下 uglifyjs添加到鼠标右键菜单 配置win ...
最新文章
- 10个快速提升技术水平的方法
- 《高效程序员的45个习惯》-之一
- Android中Activity启动模式
- linux 的 grep 命令 和 ngrep 命令
- MyEclipse 7.0 用java代码生成序列号
- 维基解密:科技公司获得安全漏洞信息须答应几个条件
- 利用iMazing将iOS设备的录音文件拷贝到电脑
- 常见手机定位方式浅谈
- win32-x64-64\binding.node is not a valid Win32 application
- uboot源码修改之支持DM9000
- 金仓数据库KingbaseES数据库管理员指南--15.1. 管理视图
- C语言例题:温度转换
- 《通关!游戏设计之道》给游戏编个故事
- 计算机硬件介绍之CPU与多线程
- Kronecker(克罗内克积)积
- Elasticsearch 中为什么选择倒排索引而不选择 B 树索引
- python基_python之地基(一)
- xinxin - 初步学习tkinter
- 阿里测试开发python面试题_[阿里面试]测试开发工程师面试
- 【致远FAQ】Guest 账号同时多人登陆导致OA卡顿