这算是一个演示程序吧,想不到上下文菜单也是採用ON_COMMAND宏来进行消息映射,在这里,我发现一个问题:从CWnd派生的类ON_UPDATE_COMMAND_UI_RANGE似乎没有效果,不知道应该再加点什么,可是从CFrameWnd派生出来问题就不会发生,真是奇怪……

看看从CWnd派生出来的效果:

contextMenuDemo.h

#pragma once
class CMyApp : public CWinApp {
virtual BOOL InitInstance();
};
class CMainWindow : public CWnd {
public:
CMainWindow();
protected:
int m_nShape;
void PostNcDestroy();
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void OnPaint();
void OnContextMenu(CWnd* pWnd, CPoint point);
void OnShape(UINT nID);
void OnUpdateShape(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP()
};

contextMenuDemo.cpp:

#include <afxwin.h>
#include "contextMenuDemo.h"
#include "resource.h"
CMyApp myApp;
BOOL CMyApp::InitInstance() {
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_CONTEXTMENU()
ON_COMMAND_RANGE(ID_SHAPE_RECT, ID_SHAPE_CIRCLE, OnShape)
ON_UPDATE_COMMAND_UI_RANGE(ID_SHAPE_RECT, ID_SHAPE_CIRCLE, OnUpdateShape)
END_MESSAGE_MAP()
CMainWindow::CMainWindow() {
CString strWndClass = AfxRegisterWndClass(0,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
(HBRUSH)(COLOR_WINDOW + 1),
AfxGetApp()->LoadStandardIcon(IDI_WINLOGO));
CreateEx(0,
strWndClass,
_T("玩玩了"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL);
m_nShape = ID_SHAPE_RECT;
}
void CMainWindow::PostNcDestroy() {
delete this;
}
int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if(CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CMainWindow::OnContextMenu(CWnd* pWnd, CPoint point) {
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CPoint pt = point;
ScreenToClient(&pt);
CRect rc;
GetClientRect(&rc);
CMenu* pMenu = menu.GetSubMenu(0);
if(rc.PtInRect(pt)) {
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,
point.y, AfxGetMainWnd());
return;
}
CWnd::OnContextMenu(pWnd, point);
}
void CMainWindow::OnShape(UINT nID) {
m_nShape = nID;
Invalidate();
}
void CMainWindow::OnPaint() {
CPaintDC dc(this);
switch(m_nShape) {
case ID_SHAPE_RECT:
dc.Rectangle(100, 100, 500, 500);
break;
case ID_SHAPE_CIRCLE:
dc.Ellipse(100, 100, 500, 500);
break;
}
}
void CMainWindow::OnUpdateShape(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(pCmdUI->m_nID == m_nShape);
}

执行效果没有太大的问题,就是SetCheck没有效果……

我们从CFrameWnd派生出来的话,问题就好了:

头文件:
#pragma once
class CMyApp : public CWinApp {
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd {
public:
CMainWindow();
protected:
int m_nShape;
//void PostNcDestroy();
//int OnCreate(LPCREATESTRUCT lpCreateStruct);
void OnPaint();
void OnContextMenu(CWnd* pWnd, CPoint point);
void OnShape(UINT nID);
void OnUpdateShape(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP()
};

实现文件:
#include <afxwin.h>
#include "contextMenuDemo.h"
#include "resource.h"
CMyApp myApp;
BOOL CMyApp::InitInstance() {
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_CONTEXTMENU()
ON_COMMAND_RANGE(ID_SHAPE_RECT, ID_SHAPE_CIRCLE, OnShape)
ON_UPDATE_COMMAND_UI_RANGE(ID_SHAPE_RECT, ID_SHAPE_CIRCLE, OnUpdateShape)
END_MESSAGE_MAP()
CMainWindow::CMainWindow() {
Create(NULL, _T("玩玩"));
m_nShape = ID_SHAPE_RECT;
}
void CMainWindow::OnContextMenu(CWnd* pWnd, CPoint point) {
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CPoint pt = point;
ScreenToClient(&pt);
CRect rc;
GetClientRect(&rc);
CMenu* pMenu = menu.GetSubMenu(0);
if(rc.PtInRect(pt)) {
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,
point.y, AfxGetMainWnd());
return;
}
CWnd::OnContextMenu(pWnd, point);
}
void CMainWindow::OnShape(UINT nID) {
m_nShape = nID;
Invalidate();
}
void CMainWindow::OnPaint() {
CPaintDC dc(this);
switch(m_nShape) {
case ID_SHAPE_RECT:
dc.Rectangle(100, 100, 500, 500);
break;
case ID_SHAPE_CIRCLE:
dc.Ellipse(100, 100, 500, 500);
break;
}
}
void CMainWindow::OnUpdateShape(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(pCmdUI->m_nID == m_nShape);
}

上下文菜单与TrackPopupMenu的更多相关文章

  1. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...

  2. (C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开 这里解释上一节中获取名称的方法 GetD ...

  3. 不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)

    说到PopupWindow,我个人感觉是又爱又恨,没有深入使用之前总觉得这个东西应该很简单,很好用,但是真正使用PopupWindow实现一些效果的时候总会遇到一些问题,但是即便是人家的api有问题, ...

  4. android上下文菜单

    XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmln ...

  5. RCP:为指定的导航器添加上下文菜单

    可以参考Eclipse的Help->Help Content下的: Platform Plug-in Developer Guide > Programmer's Guide > P ...

  6. 【WP 8.1开发】上下文菜单

    在桌面系统中,别说是开发者,相信有资格考得过计算机一级的人都知道什么叫一下文菜单,或者叫右键菜单. 为了让操作更方便,在手机应用程序中,也应当有这样的菜单.上下文菜单之所以有”上下文“之说,是因为通常 ...

  7. Android成长日记-ContextMenu实现上下文菜单

    一. ContextMenu的组成 标题以及标题图标 菜单内容 菜单内容的点击事件 二. ContextMenu与OptionMenu的区别 OptionMenu对应的是activity,一个acti ...

  8. Java基础之扩展GUI——高亮元素、上下文菜单、移动旋转元素、自定义颜色(Sketcher 10)

    窗口应用程序. 本例在上一版的基础上实现了高亮元素.移动元素.上下文菜单.旋转元素.设置自定义颜色. 1.自定义常量包: // Defines application wide constants p ...

  9. 安卓开发_浅谈ContextMenu(上下文菜单)

    长下文菜单,即长按view显示一个菜单栏 与OptionMenu的区别OptionMenu对应的是activity,一个activity只能拥有一个选项菜单ContextMenu对应的是View,每个 ...

随机推荐

  1. vim的ex模式用法

    本文出自   http://blog.csdn.net/shuangde800 本文是在学习<使用vi编辑器, Lamb & Robbins编著>时在evernote写的其中一章笔 ...

  2. 基于visual Studio2013解决面试题之0610删除重复字符串

     题目

  3. 基于visual Studio2013解决C语言竞赛题之1051数的顺序

       题目 解决代码及点评 /* 功能:自然数N一般写成如下形式: N=d[k]d[k-1]d[1] (d[1]-d[k] 均是十进制数字) 如果d[i+1]>d[i] (i=k-1 ...

  4. Javascript做模糊查询

    <html> <head> <title>Javascript模糊查找</title> </head> <body> <l ...

  5. android优化原理

    时间换时间: 数据的异步载入 分批载入. 开机加速. 时间换空间:  分页. 空间换时间: everything.exe 音乐 图库 在开机启动后, sd卡被挂载 生成数据库. 空间换空间: 8G内存 ...

  6. Apple iOS MDM开发流程

    一年前曾参与过中石油的一个移动平台项目,实现了通过MDM对iOS设备进行管理.由于苹果对于mdm这块的接口及开发流程只向几个合作伙伴进行了分享,并没有对具体实现的文档进行公开,所以这方面的资料非常少. ...

  7. POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)

    Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...

  8. linux下C/C++,多线程pthread《转载》

    原文网址:http://www.cnblogs.com/xianghang123/archive/2011/08/11/2134927.html ·线程创建   函数原型:int pthread_cr ...

  9. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  10. 推荐一款功能强大的js 在线编辑器

    http://jszi.cn/public/oherub/11/edit