仿MFC的消息印射(全局函数的实现)
//弄了个仿MFC消息映射,这是全局函数都好弄,照着MFC就弄出来了,
//在vs2017上可以通过
#include <windows.h>
#include "resource.h"
#include "QDialog.h"
#include "QWinDlg.h"
//全局实例句柄
HINSTANCE g_hInstance; //函数的前导声明
LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //定义的函数指针的结构体
struct decodeUINT
{
UINT uCode; //消息号码
LRESULT(*Fxn)(HWND, UINT, WPARAM, LPARAM); //函数指针还是指针函数,有点晕这会
}; //消息映射宏,抄MFC的
#define MAIN_BEGIN_MSG() const struct decodeUINT MainWndMessage[] = {
#define MAIN_END_MSG }; //消息映射数组
MAIN_BEGIN_MSG()
WM_INITDIALOG,OnInitDialog,
WM_PAINT,OnPaintMain,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy,
WM_COMMAND,OnCommand,
IDWINOK,OnIDOK,
IDC_ADD_BTN,OnCancel,
MAIN_END_MSG
//计算消息数组的个数
#define MAIN_MSG_COUNT sizeof(MainWndMessage) / sizeof(decodeUINT) //过程函数的声明
INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //主函数
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
g_hInstance = hInstance;
HWND hWnd = ::CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, NULL, WinProc);
if (hWnd == NULL)
return 0; ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd); MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return 0;
}
//过程函数的实现
INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ //循环查找消息数组中的消息,有就返回执行找到的消息对应的函数
for (int i = 0;i< MAIN_MSG_COUNT;i++)
{
if (uMsg == MainWndMessage[i].uCode)
return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam); }
//没有找到就返回默认的消息处理函数
return DefWindowProc(winHwnd, uMsg, wParam, lParam); }
//下面就是各个函数的实现
LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
} LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
} LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DestroyWindow(winHwnd);
return 1;
} LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
} LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
for (int i = 0; i < MAIN_MSG_COUNT; i++)
{
//这和上面的循环查找一样,只是条件改为wParam,
if (LOWORD(wParam) == MainWndMessage[i].uCode)
{
return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam);
}
}
return 1;
} LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
QWinDlg dlg;
dlg.ShowDialog(winHwnd);
return 0;
}
LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
} //这是全局函数都还好说,我想弄成MFC一样的在类中封装成这样的消息映射,就卡壳了,在网上查了许多,
都全是用静态函数来实现的,我在想静态其实也就是全局函数嘛,和这没有多大区别,为啥MFC就能弄出封装到类中的
消息映射机制呢.这下卡就半个多月,没有师父就是这样,没人指点.
仿MFC的消息印射(全局函数的实现)的更多相关文章
- MFC全局函数开局——AfxGetApp解剖
MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象.主要全局函数有: AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormat ...
- MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx
MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx. 函数名称 说明 AfxWinInit 被WinMain(MFC提供)调用的一个函数,用做MFC GUI程序初始化的一部分,如果 ...
- 在MFC下如何定义全局变量和全局函数
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际上有多种方法可以实现,这里只介绍两种 ...
- MFC消息映射及消息处理函数原型
MFC把消息主要分为三大类: 1. 标准Windows消息(WM_XXX) 2. 命令消息(WM_COMMAND):凡由UI对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮. 3. 控 ...
- 部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程)
部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程) 这些功能也能帮助用户了解和监控SQLSERVER的运行情况 DBCC语句,DBCC语句是SQL2005的数据库控制台命令 D ...
- MFC中消息响应机制
由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- MFC的消息映射机制揭秘
MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...
- MFC的消息反射机制
1.消息反射解释: 父窗口将子窗口发给它的通知消息,首先反射回子窗口进行处理(即给子窗口一个机会,让子窗口处理此消息),这样通知消息就有机会能被子窗口自身进行处理. 2.MFC中引入消息反射的原因: ...
- MFC的消息机制
MFC的消息循环(::GetMessage,::PeekMessage)消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情 分两个步骤完成: 1 “ ...
随机推荐
- 集成学习与随机森林(二)Bagging与Pasting
Bagging 与Pasting 我们之前提到过,其中一个获取一组不同分类器的方法是使用完全不同的训练算法.另一个方法是为每个预测器使用同样的训练算法,但是在训练集的不同的随机子集上进行训练.在数据抽 ...
- EEPROM、Flash有关知识
存储器分为两大类:RAM(Random Access Memory,任意地址访问储存器)和ROM(Read-Only Memory,只读储存器). 发展历史 ROM Read-Only Memory, ...
- 【ClickHouse】1:clickhouse安装 (CentOS7)
一:安装clickhouse 官网地址:https://clickhouse.tech/#quick-start 按照官网提供的方法快速安装:(依次执行) sudo yum install yum-u ...
- 实现ASP.Net Core3.1运行在DockeDesktop下并用Nginx实现负载均衡
一.首先去https://docs.docker.com/get-docker/下载Windows版本的Docker Desktop并安装(需要win10专业版以上操作系统,并启用CPU虚拟化和安装H ...
- Oracle plsql中文字段乱码,where条件中文字段搜不到结果集
设置系统环境变量 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK
- 2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.
2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1.0和1. 一个子数组nums[i. ...
- Spring Cloud微服务下如何配置I8n
什么是I8n 国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改.这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和 ...
- 在宝塔上配置打包好的vue3项目
配置文件如下 server{ listen 80; server_name gongchang.365cb.cn; index index.html index.htm default.php def ...
- [oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
转义字符 回忆上次内容 最近玩的是\n.\r 之外的转义序列 \a是 ␇ (bell) \t是 水平制表符 \v是 换行不回车 通过 16 进制数值转义 \xhh 把(hh)16 进制对应的 asci ...
- NOIP2022退役记
我是青岛西海岸新区的一名oier,qxyz(xhayz)的. (其实也不知道算不算得上真正的oier) 已经高二了,是最后一次noip了,必须写点什么记录一下了吧,这样至少可以向世界留下一点痕迹:这个 ...