MFC消息ON_WM_CONTEXTMENU

当用户在MFC应用程序中右键单击窗口时,会触发ON_WM_CONTEXTMENU消息。该消息的宏定义展示了其处理方式,并指出消息对应的当前窗体或控件,同时提供了鼠标点击位置的坐标。利用这个消息,开发者可以实现右键点击时弹出上下文菜单的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ON_WM_CONTEXTMENU消息说明:用户右键窗口时调用

此消息在右键单击窗口时调用,此消息的宏


[cpp]  view plain  copy
  1. #define ON_WM_CONTEXTMENU() \  
  2.     { WM_CONTEXTMENU, 0, 0, 0, AfxSig_vWp, \  
  3.         (AFX_PMSG)(AFX_PMSGW) \  
  4.         (static_castvoid (AFX_MSG_CALL CWnd::*)(CWnd*, CPoint) > ( &ThisClass :: OnContextMenu)) },  

从结构中可以看出,此消息实际的对应的函数名为OnContextMenu参数CWnd*, CPoint一个为一个窗体的句柄,一个为坐标。


从网上资料得知,窗体可以为任意一个windows窗体,实际测试得到的结果是:接收消息所对应的当前窗体中的窗体(或控件),CPoint即接收到此消息时的鼠标坐标。

此时可以做很多事,比如,右键单击到一个控件时,弹出一个菜单。


#include "pch.h" #include "framework.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MFC3DApp.h" #endif #include "MFC3DAppDoc.h" #include "MFC3DAppView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMFC3DAppView IMPLEMENT_DYNCREATE(CMFC3DAppView, CView) BEGIN_MESSAGE_MAP(CMFC3DAppView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFC3DAppView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() // CMFC3DAppView 构造/析构 CMFC3DAppView::~CMFC3DAppView() { } BOOL CMFC3DAppView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMFC3DAppView 绘制 void CMFC3DAppView::OnDraw(CDC* pDC) { CMFC3DAppDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; for (const auto& cube : m_cubes) { TwoXiece(cube, pDC); } } void CMFC3DAppView::TwoXiece(const std::array<float, 8 * 3>& vertices, CDC* pDC) { // 获取客户区域 CRect clientRect; GetClientRect(&clientRect); // 计算中心点 int centerX = clientRect.Width() / 2; int centerY = clientRect.Height() / 2; // 投影后的顶点坐标 CPoint projected[8]; double cosTheta = cos(m_b); double sinTheta = sin(m_b); for (int i = 0; i < 8; ++i) { double x = vertices[i * 3 + 0]; double y = vertices[i * 3 + 1]; double z = vertices[i * 3 + 2]; // 斜二测投影公式 double px = x + z * m_t * cosTheta; double py = y + z * m_t * sinTheta; // 转换为屏幕坐标(中心点偏移) projected[i].x = centerX + (int)(px); projected[i].y = centerY - (int)(py); } CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CPen* pOldPen = pDC->SelectObject(&pen); // 立方体边的索引对 static int edges[12][2] = { {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 5}, {5, 6}, {6, 7}, {7, 4}, {0, 4}, {1, 5}, {2, 6}, {3, 7} }; // 绘制立方体边 for (int i = 0; i < 12; ++i) { int a = edges[i][0]; int b = edges[i][1]; pDC->MoveTo(projected[a]); pDC->LineTo(projected[b]); } pDC->SelectObject(pOldPen); } // CMFC3DAppView 打印 void CMFC3DAppView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CMFC3DAppView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMFC3DAppView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMFC3DAppView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CMFC3DAppView::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CMFC3DAppView::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } void CMFC3DAppView::OnLButtonDown(UINT nFlags, CPoint point) { CView::OnLButtonDown(nFlags, point); m_startPoint = point; } void CMFC3DAppView::OnLButtonUp(UINT nFlags, CPoint point) { CView::OnLButtonUp(nFlags, point); m_endPoint = point; // 固定大小的正方体 float size = 50.0f; // 固定大小 // 使用起点作为正方体的中心点 float centerX = m_startPoint.x; float centerY = m_startPoint.y; // 创建新的正方体顶点 std::array<float, 8 * 3> newCube = { centerX - size, centerY - size, 0, centerX + size, centerY - size, 0, centerX + size, centerY + size, 0, centerX - size, centerY + size, 0, centerX - size, centerY - size, size * 2, centerX + size, centerY - size, size * 2, centerX + size, centerY + size, size * 2, centerX - size, centerY + size, size * 2 }; // 添加新正方体到列表 m_cubes.push_back(newCube); // 刷新视图 Invalidate(); } #ifdef _DEBUG void CMFC3DAppView::AssertValid() const { CView::AssertValid(); } void CMFC3DAppView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFC3DAppDoc* CMFC3DAppView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC3DAppDoc))); return (CMFC3DAppDoc*)m_pDocument; } #endif //_DEBUG 这些代码完成一个正方体的斜二侧投影吗?
最新发布
05-30
// MFC3DAppView.cpp: CMFC3DAppView 类的实现 // #include "pch.h" #include "framework.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MFC3DApp.h" #endif #include "MFC3DAppDoc.h" #include "MFC3DAppView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMFC3DAppView IMPLEMENT_DYNCREATE(CMFC3DAppView, CView) BEGIN_MESSAGE_MAP(CMFC3DAppView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFC3DAppView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() END_MESSAGE_MAP() // CMFC3DAppView 构造/析构 CMFC3DAppView::CMFC3DAppView() noexcept { // TODO: 在此处添加构造代码 } CMFC3DAppView::~CMFC3DAppView() { } BOOL CMFC3DAppView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMFC3DAppView 绘图 void CMFC3DAppView::OnDraw(CDC* pDC) { CMFC3DAppDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; TwoXiece(m_vertices, pDC); } // CMFC3DAppView 打印 void CMFC3DAppView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CMFC3DAppView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMFC3DAppView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMFC3DAppView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CMFC3DAppView::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CMFC3DAppView::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } void CMFC3DAppView::TwoXiece(float * p, CDC * pDC) { int i, q[24], j = 0; float x, y, z; for (i = 0; i < 24; i = i + 3) { x = p[i]; y = p[i + 1]; z = p[i + 2]; p[i] = x + z * m_t * cos(m_b); p[i + 1] = y + z * m_t * sin(m_b); p[i + 2] = 0; } for (i = 0; i < 24; i = i + 3) { q[j++] = (int)p[i]; q[j++] = (int)p[i + 1]; } CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CPen* pOldPen = pDC->SelectObject(&pen); int s1[10] = { q[0], q[1], q[2], q[3], q[10], q[11], q[8], q[9], q[0], q[1] }; int s2[10] = { q[4], q[5], q[6], q[7], q[14], q[15], q[12], q[13], q[4], q[5] }; pDC->Polygon((LPPOINT)s1, 5); pDC->Polygon((LPPOINT)s2, 5); pDC->MoveTo(q[0], q[1]); pDC->LineTo(q[6], q[7]); pDC->MoveTo(q[2], q[3]); pDC->LineTo(q[4], q[5]); pDC->MoveTo(q[8], q[9]); pDC->LineTo(q[14], q[15]); pDC->MoveTo(q[10], q[11]); pDC->LineTo(q[12], q[13]); pDC->SelectObject(pOldPen); } // CMFC3DAppView 诊断 #ifdef _DEBUG void CMFC3DAppView::AssertValid() const { CView::AssertValid(); } void CMFC3DAppView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFC3DAppDoc* CMFC3DAppView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC3DAppDoc))); return (CMFC3DAppDoc*)m_pDocument; } #endif //_DEBUG // CMFC3DAppView 消息处理程序 这个正方体画出来有点缺陷
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值