这算是一个演示程序吧,想不到上下文菜单也是採用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. Swift - 判断设备方向(或监听设备方向的改变)

    通过UIDevice.currentDevice()来获取设备,可以取得设备当前的方向. 同时,我们可以添加一个通知来监听设备方向的变化,这样在开发中可以对不同的方向定制不同的排版布局界面. 下面通过 ...

  2. Android原生APP内分享

    Android原生APP内分享,可实现数据分享以及assets文件夹分享及私有文件分享 项目地址:https://github.com/json-pu/AndroidAppShare.git

  3. Eclipse用法和技巧十一:分栏显示

    在编码的时候,有时候需要同时看到两个文件的代码.或者在代码走读的时候,能同时看到两个文件的代码能加快我们对代码的理解.来看看如何在eclipse中同时显示两个文件的代码.        步骤一:拖住一 ...

  4. Eclipse用法和技巧一:还原视图和编辑器

    链接地址:http://blog.csdn.net/maybe_windleave/article/details/8763744 在实际使用eclipse过程中,由于经常关闭或者打开视图,某一刻你会 ...

  5. Windows Azure入门教学系列 (二):部署第一个Web Role程序

    本文是Windows Azure入门教学的第二篇文章. 在第一篇教学中,我们已经创建了第一个Web Role程序.在这篇教学中,我们将学习如何把该Web Role程序部署到云端. 注意:您需要购买Wi ...

  6. PHP学习之-1.7 注释

    注释 在PHP中也有注释语句:用双斜杠 "//" 来表示.其他语言中 HTML使用 "<!--  -->" ,CSS中使用 "/*     ...

  7. 14.10.1 InnoDB Disk I/O

    14.10 InnoDB Disk IO and File Space Management InnoDB 磁盘IO和文件空间管理: 14.10.1 InnoDB Disk I/O 14.10.2 F ...

  8. 基于visual Studio2013解决面试题之0608找出两个只出现一次的数

     题目

  9. haproxy redirect location和redirect prefix

    <pre name="code" class="html">redirect location <loc> [code <code ...

  10. Solr集群、KI分词、项目实战

    Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善 ...