//弄了个仿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. Mac下Eclipse打不开了怎么办

    其实这个问题能搜到很多答案,但是对我有效的只有下面这一种. 背景 我需要使用到Eclipse,就下载了它的特定版本,用于开发RAP的. 连续两次都是使用后关闭,就再也打不开了. 选定的解决方案 试了好 ...

  2. 阿里云服务器Docket安装RabbitMQ 3.8.12

    DocketMQ安装RabbitMQ 地址:https://hub.docker.com/ 拉取镜像 docker pull rabbitmq:3.8.12-management-alpine 运行 ...

  3. JavaSE 常见时间日期

    java.util包提供了Date类来封装当前的⽇期和时间 构造函数 //当前时间 Date() //从1970年1⽉1⽇起的毫秒数作为参数 Date(long millisec) 常见方法 //返回 ...

  4. PixiJS源码分析系列: 第一章 从最简单的例子入手

    从最简单的例子入手分析 PixiJS 源码 我一般是以使用角度作为切入点查看分析源码,例子中用到什么类,什么方法,再入源码. 高屋建瓴的角度咱也做不到啊,毕竟水平有限 pixijs 的源码之前折腾了半 ...

  5. 全网最适合入门的面向对象编程教程:08 类和对象的Python实现-@property装饰器:把方法包装成属性

    全网最适合入门的面向对象编程教程:08 类和对象的 Python 实现-@property 装饰器:把方法包装成属性 摘要: 本文主要对@property 装饰器的基本定义.使用场景和使用方法进行了介 ...

  6. 原创软件 | 第3期:PDF合并分割助手V1.0(个人免费)

    这是一个短的"发布会". 01 基本介绍 近期开发了一个[PDF合并分割助手]. 它是一个实现pdf快速合并.分割的免费软件. 你拥有以下7种选项设置. >>合并选项& ...

  7. Windows系统下DoH配置小记

    Windows系统下DoH配置小记 浏览器 Edge 打开edge://settings/privacy 使用安全的 DNS 指定如何查找网站的网络地址 设置自定义服务商为https://doh.op ...

  8. [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式

    utf-8 回忆上次内容 上次再次输出了大红心<span style="color:red"></span> 找到了红心对应的编码 黑红梅方都对应有编码   ...

  9. 【译】使 Visual Studio 更加可视化

    任何 Web.桌面或移动开发人员都经常使用图像.你可以从 C#.HTML.XAML.CSS.C++.VB.TypeScript 甚至代码注释中引用它们.有些图像是本地的,有些存在于线上或网络共享中,而 ...

  10. Excel VBA编程常用语句300句

    定制模块行为 1. Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Opt ...