//弄了个仿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的消息印射(全局函数的实现)的更多相关文章

  1. MFC全局函数开局——AfxGetApp解剖

    MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象.主要全局函数有: AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormat ...

  2. MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx

    MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx. 函数名称 说明 AfxWinInit 被WinMain(MFC提供)调用的一个函数,用做MFC GUI程序初始化的一部分,如果 ...

  3. 在MFC下如何定义全局变量和全局函数

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际上有多种方法可以实现,这里只介绍两种 ...

  4. MFC消息映射及消息处理函数原型

    MFC把消息主要分为三大类: 1. 标准Windows消息(WM_XXX) 2. 命令消息(WM_COMMAND):凡由UI对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮. 3. 控 ...

  5. 部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程)

    部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程) 这些功能也能帮助用户了解和监控SQLSERVER的运行情况 DBCC语句,DBCC语句是SQL2005的数据库控制台命令 D ...

  6. MFC中消息响应机制

    由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...

  7. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  8. MFC的消息映射机制揭秘

    MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...

  9. MFC的消息反射机制

    1.消息反射解释: 父窗口将子窗口发给它的通知消息,首先反射回子窗口进行处理(即给子窗口一个机会,让子窗口处理此消息),这样通知消息就有机会能被子窗口自身进行处理. 2.MFC中引入消息反射的原因: ...

  10. MFC的消息机制

    MFC的消息循环(::GetMessage,::PeekMessage)消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情 分两个步骤完成: 1 “ ...

随机推荐

  1. 总结:软件开发的3个方向 与 嵌入式Linux学习路线(驱动方向)

    --- title: 嵌入式Linux学习路线图(驱动方向) date: 2020-05-09 07:17:58 categories: tags: - embeded - summary - arm ...

  2. 基于SQLite3的C学习总结

    背景 针对 SQLite3 的学习总结 arm linux 移植 SQLite 3 如何在 Linux 上移植使用 SQLite3,标题虽然是在讲 arm linux,但实际上是跨平台的. 基于 SQ ...

  3. 【论文阅读】IROS2017: Voxblox & RAL2019: Voxblox++

    IROS2017: Voxblox & RAL2019: Voxblox++ Status: Finished Type: RAL Year: 2019 组织/Sensor: ETH-ASL ...

  4. 3568F-Linux-RT系统测试手册

  5. 新品再袭,比RK3568J降本40%+,瑞芯微最新性价比工业平台-RK3562J

  6. 我对《RAG/大模型/非结构化数据知识库类产品》技术架构的思考、杂谈

    1.前言 在6.28/29的稀土掘金开发者大会RAG专场上,我们公司CEO员外代表TorchV分享了我们在<RAG在企业应用中落地的难点与创新> 其中最后分享了两个观点: AI在应用场景落 ...

  7. 尝试官方的第一个SpringNative 0.11程序(WSL2)

    Spring Native是Spring推出微服务体系Spring Cloud之后的又一大举动,从名字可以猜出,Spring Native是一门面向云原生的技术.如果你还对这个概念不太理解,可以多看一 ...

  8. yb课堂之用户注册登陆模块《六》

    用户注册功能接口开发 注册接口开发 MD5加密工具类封装 UserMapper.xml <?xml version="1.0" encoding="UTF-8&qu ...

  9. 【实操记录】MySQL二进制安装包部署

    截至2023年11月2日,MySQL社区版最新版本是8.0.35,本文详细描述了采用二进制安装的各个步骤,具有较强的参考意义,基本可作为标准步骤实施. ■ 下载数据库介质 社区版的下载地址为oracl ...

  10. NOIP2023

    坐标HA 背景 打完CSP-S后觉得自主招生稳了,就想着NOIP摆烂,所以此游记仅仅是为了凑数. 正文 Day 0 不出所料,机房统一集训,但是在CSP集训后导致的期中挂分的影响下,这一想法被家长以及 ...