【上位機——MFC】消息映射機制

消息映射機制

  • Window消息分類
  • 消息映射機制的使用
    • 代碼示例

MFC框架利用消息映射機制把消息、命令與它們的處理函數映射起來。具體實現方法是在每個能接收和處理消息的類中,定義一個消息和消息函數指針對照表,即消息映射表。

在不重寫WindowProc虛函數的大前提下,仍然可以處理消息。

Window消息分類

  1. 標準Windows消息:除WM_COMMAND外以WM_開頭的消息都是標準消息。
  2. 命令消息:消息名為WM_COMMAND,消息中附帶了標識符ID來區分來自哪個菜單、工具欄按鈕或加速鍵的消息。
  3. 通知消息:通知消息一般由列表框等子窗口發送給父窗口,消息名也是WM_COMMAND,其中附帶了控件通知碼來區分控件。
  4. 用戶自定義消息:用戶定義一個宏作為消息,值大于WM_USER。

CWnd的派生類可以接收者四種消息,命令消息還可以由文檔類接收。
命令消息的處理順序:框架類(CFrameWnd派生類)優先于應用程序類(CWinApp派生類)。視圖類(CView派生類)優先于框架類(CFrameWnd派生類)。

消息映射可以通過VS2022的菜單項自動生成
項目-》類向導 選擇你需要再哪個類中添加對應的消息。
如下圖:
在這里插入圖片描述

消息映射機制的使用

  1. 類內必須添加聲明宏
    DECLARE_MESSAGE_MAP() 
    
  2. 類外必須添加實現宏
    BEGIN_MESSAGE_MAP(theClass,baseClass)
    END_MESSAGE_MAP()
    

當一個類具備上述兩個條件,這個類就可以按照消息映射機制來處理消息。

代碼示例

#include <afxwin.h>
#include "resource.h"//自定義消息
#define WM_MYMESSAGE WM_USER+1001//1.定義自己的框架類CMyFrameWnd,派生自CFrameWnd類
class CMyFrameWnd :public CFrameWnd {DECLARE_MESSAGE_MAP()public:afx_msg int OnCreate(LPCREATESTRUCT param);afx_msg void OnPaint(void);afx_msg void OnMouseMove(UINT nKey, CPoint pt);afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);afx_msg void OnOpen();afx_msg void OnInitMenuPopup(CMenu* pPopup,UINT nPos, BOOL i);afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);int m_x;int m_y;CMenu menu;};BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)//使用標準消息實現WM_CREATE (窗口創建)消息的處理ON_WM_CREATE()//使用標準消息實現WM_PAINT(繪圖)消息的處理ON_WM_PAINT()//使用標準消息實現鼠標移動消息ON_WM_MOUSEMOVE()//自定義消息ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)//命令消息ON_COMMAND(ID_OPEN, &CMyFrameWnd::OnOpen)//標準消息ON_WM_INITMENUPOPUP()//標準消息ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()//ON_WM_CREATE消息調用的函數
int CMyFrameWnd::OnCreate(LPCREATESTRUCT param) {//加載菜單方式二menu.LoadMenu(IDR_MENU1);this->SetMenu(&menu);AfxMessageBox("ON_WM_CREATE");//發送自己定義的消息::PostMessage(this->m_hWnd, WM_MYMESSAGE, 1, 2);return CFrameWnd::OnCreate(param);
}//ON_WM_PAINT消息調用的函數
void CMyFrameWnd::OnPaint(void) {PAINTSTRUCT ps = { 0 };HDC hdc = ::BeginPaint(this->m_hWnd, &ps);::TextOutA(hdc, m_x, m_y, "hello", 5);::EndPaint(m_hWnd, &ps);
}//OnMouseMove消息調用的函數
void CMyFrameWnd::OnMouseMove(UINT nKey, CPoint pt) {m_x = pt.x;m_y = pt.y;//hello 字符串跟著鼠標移動::InvalidateRect(this->m_hWnd, NULL, TRUE);}
//自定義消息
LRESULT CMyFrameWnd::OnMyMessage(WPARAM wParam, LPARAM lParam) {CString str;str.Format("wParam=%d, lParam=%d", wParam, lParam);AfxMessageBox(str);return 0;
}//命令消息 點擊打開
void CMyFrameWnd::OnOpen()
{AfxMessageBox("ON_COMMAND");
}//設置菜單狀態
void CMyFrameWnd::OnInitMenuPopup(CMenu* pPopup, UINT nPos, BOOL i) 
{//ID為ID_OPEN的菜單項前面打對號pPopup->CheckMenuItem(ID_OPEN,MF_CHECKED);
}//鼠標右鍵
void CMyFrameWnd::OnContextMenu(CWnd* pWnd, CPoint point)
{//HMENU hPopup = ::GetSubMenu(menu.m_hMenu,0);//展示菜單//::TrackPopupMenu(hPopup,TPM_LEFTALIGN|TPM_TOPALIGN,point.x,point.y,0,this->m_hWnd,NULL);//上下兩種方式均可CMenu* pPopup = menu.GetSubMenu(0);//展示菜單pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, point.x, point.y,this);
}//定義自己應用程序類CMyWinApp,派生自CWinApp類,
//并定義構造以及重寫InitInstance虛函數,在函數中創建并顯示窗口
class CMyWinApp :public CWinApp {public :CMyWinApp() {}virtual BOOL InitInstance() {CMyFrameWnd* pFrame = new CMyFrameWnd;//最后一個參數 加載菜單方式一(常用)//pFrame->Create(NULL,"MFCBase",WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,(CHAR*)IDR_MENU1);pFrame->Create(NULL, "MFCBase");m_pMainWnd = pFrame;pFrame->ShowWindow(SW_SHOW);pFrame->UpdateWindow();return TRUE;}
};//3.定義CMyWinApp類的對象(程序的爆破點)
CMyWinApp theApp;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79965.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker學習筆記2-最佳實踐

一、在容器中啟動mysql的最佳實踐 &#xff08;一&#xff09;查找目錄 1、mysql的配置文件路徑 /etc/mysql/conf.d 2、mysql的數據目錄 /var/lib/mysql 3、環境變量 4、端口 mysql的默認端口3306。 &#xff08;二&#xff09;啟動命令 docker run -d -p 3306:3306 …

Vue3核心源碼解析

/packages/complier-core 定位??&#xff1a;??編譯時核心??&#xff0c;處理 Vue 模板的編譯邏輯。??核心功能??&#xff1a; ??模板解析??&#xff1a;將 .vue 文件的模板語法&#xff08;HTML-like&#xff09;解析為 ??抽象語法樹 (AST)??。??轉換優化…

n8n 中文系列教程_05.如何在本機部署/安裝 n8n(詳細圖文教程)

n8n 是一款強大的開源工作流自動化工具&#xff0c;可幫助你連接各類應用與服務&#xff0c;實現自動化任務。如果你想快速體驗 n8n 的功能&#xff0c;本機部署是最簡單的方式。本教程將手把手指導你在 Windows 或 MacOS 上通過 Docker 輕松安裝和運行 n8n&#xff0c;無需服務…

【python】pyCharm常用快捷鍵使用-(2)

pyCharm常用快捷鍵使用 快速導入任意類 【CTRLALTSPACE】代碼補全【CTRLSHIFTENTER】代碼快速修正【ALTENTER】代碼調試快捷鍵

Docker 鏡像、容器和 Docker Compose的區別

前言&#xff1a;Docker 的鏡像、容器和 Docker Compose 是容器化技術的核心組件&#xff0c;以下是對它們的詳細解析及使用場景說明。 ??1、Docker 鏡像&#xff08;Image&#xff09;?? ??定義??&#xff1a; 鏡像是只讀模板&#xff0c;包含運行應用程序所需的代碼、…

算法——背包問題(分類)

背包問題&#xff08;Knapsack Problem&#xff09;是一類經典的組合優化問題&#xff0c;廣泛應用于資源分配、投資決策、貨物裝載等領域。根據約束條件和問題設定的不同&#xff0c;背包問題主要分為以下幾種類型&#xff1a; 1. 0-1 背包問題&#xff08;0-1 Knapsack Probl…

多路由器通過RIP動態路由實現通訊(單臂路由)

多路由器通過RIP動態路由實現通訊&#xff08;單臂路由&#xff09; R1(開啟端口并配置IP) Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shu Router(config-if)#no shutdown Router(config-if)#ip add 192.168.10.254 255.255.255.0 Router(c…

從底層設計原理分析并理解SQL 的執行順序

?一、執行順序的底層設計原理?? ??1. 數據源的確定與連接&#xff08;FROM → ON → JOIN&#xff09;?? ??FROM??&#xff1a;數據庫首先需要確定數據的物理來源&#xff0c;從磁盤加載表或子查詢的原始數據。此時尚未應用任何篩選&#xff0c;僅讀取元數據&#…

游戲引擎學習第237天:使用 OpenGL 顯示圖像

win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我們正在處理一個新的開發階段&#xff0c;目標是在使用 OpenGL 渲染的同時能正常通過 OBS 進行直播。昨天我們已經嘗試了一整天來解決這個問題&#xff0c;希望能找到一種方式讓 OBS 能正確地捕捉到 OpenGL 的窗口畫面。雖然我們不確定…

(二)mac中Grafana監控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、監控查看端安裝 Grafana安裝-CSDN博客 普羅米修斯Prometheus監控安裝&#xff08;mac&#xff09;-CSDN博客 1.啟動Grafana服務 brew services start grafana 打開瀏覽器輸入http://localhost:3000進入grafana登錄…

GitHub 趨勢日報 (2025年04月17日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1Anduin2017/HowToCook程序員在家做飯方法指南。Programmer’s guide about how to cook at home (Simplified Chinese onl…? 224…

(一)mac中Grafana監控Linux上的CPU等(Node_exporter 安裝使用)

框架&#xff1a;GrafanaPrometheusNode_exporter 機器狀態監控(監控服務器CPU,硬盤&#xff0c;網絡等狀態) Node_exporter安裝在被測服務器上&#xff0c;啟動服務 各步驟的IP地址要換為被測服務器的IP地址Prometheus.yml的 targets值網頁訪問的ip部分grafana添加數據源的…

java IO/NIO/AIO

(?▽?)曼波~~~~&#xff01;讓曼波用最可愛的賽馬娘方式給你講解吧&#xff01;(? ???ω??? ?) &#x1f3a0;曼波思維導圖大沖刺&#xff08;先看框架再看細節哦&#xff09;&#xff1a; &#x1f4da; 解釋 Java 中 IO、NIO、AIO 的區別和適用場景&#xff1a; …

Silverlight發展歷程(微軟2021年已經停止支持Silverlight 5)

文章目錄 Microsoft Silverlight 發展歷程引言起源與背景&#xff08;2006-2007&#xff09;互聯網技術格局與微軟的挑戰WPF/E 項目的啟動 Silverlight 1.0 的誕生&#xff08;2007&#xff09;正式命名與首次發布初步的市場定位 Silverlight 2.0&#xff1a;真正的突破&#x…

【大數據、數據開發與數據分析面試題匯總(含答案)】

在大數據、數據開發與數據分析領域的面試中&#xff0c;扎實掌握各類知識點至關重要。以下是精心整理的面試題&#xff0c;涵蓋單選題和多選題&#xff0c;助你備考一臂之力。 試題目錄 大數據、數據開發與數據分析高頻面試題解析1. 數據倉庫分層架構設計2. 維度建模與范式建模…

Docker部署禪道21.6開源版本

將數據庫相關環境變量分開&#xff0c;增加注釋或空格使得命令更易讀。 如果你的 MySQL 主機、端口等配置沒有變化&#xff0c;應該確保這些信息是安全的&#xff0c;并考慮使用 Docker secrets 或環境變量配置來避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …

Yocto項目實戰教程 · 第4章:4.2小節-菜譜

&#x1f50d; B站相應的視頻教程&#xff1a; &#x1f4cc; Yocto項目實戰教程-第4章-4.2小節-菜譜 記得三連&#xff0c;標為原始粉絲。 在 Yocto 項目中&#xff0c;**菜譜&#xff08;Recipe&#xff09;**承載了包的配置信息、源碼獲取方式、編譯與安裝步驟&#xff0c;是…

【pytorch】torch.nn.Unfold操作

說明 一個代碼里涉及到了unfold的操作&#xff0c;看了半天官網都沒整明白維度怎么變化的&#xff0c;參考這個鏈接搞明白了&#xff1a; https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 維度計算 輸入&#xff08; N,…

Linux 固定IP地址

一.查看網口狀態&#xff1a; $ ip a 二.配置靜態IP文件&#xff1a; $ sudo vi /etc/network/interface auto eth0 iface eth0 inet static address 192.168.0.252 gateway 192.168.0.1 netmask 255.255.255.0 #network 192.168.0.0 #broadcast 192.168.0.255 三.重啟網卡讓新…

android的 framework 有哪些知識點和應用場景

Android Framework 知識點 1. 四大組件 Activity&#xff08;活動&#xff09; 是 Android 應用中最基本的組件&#xff0c;用于實現用戶界面。一個 Activity 通常對應一個屏幕的內容。有自己的生命周期&#xff0c;包括 onCreate、onStart、onResume、onPause、onStop、onDe…