前面弄的是全局的仿消息映射,现在这是封装到类中的消息映射,一直弄不明白,现在也不太明白,就是今天在看
虚函数表的用法视频时有位老师用了个共有体转化全局函数为类成员函数,这就给我指了条明路,这不今晚又来弄,
来来回回错了无数,终于给过了,开心!

[QDialog.h]文件

#include <windows.h>

//定义消息函数的标识,没啥意思的,只为区分消息函数和普通函数的
#define Afx_MSG

class QDialog
{ public:
QDialog();
~QDialog(); INT_PTR ShowDialog(HWND _pHwnd); INT_PTR CALLBACK dlgProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR OnDlgClose(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Afx_MSG BOOL OnDlgCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Afx_MSG BOOL OnSysCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Afx_MSG BOOL OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
DWORD m_IDD;
HWND m_hWind;
};

[QDialog.cpp]文件

#include "QDialog.h"
#include "resource.h"
#include "QWinDlg.h"

//定义结构体
struct QMSG
{
UINT uCode;  //消息号码
BOOL (QDialog::*Fxn)(HWND, UINT, WPARAM, LPARAM);  //指针函数
};

//定义一个类的全局对象指针
QDialog *dlgApp; QDialog::QDialog()
{
m_IDD = IDD_DIALOG2;
dlgApp = this;
} QDialog::~QDialog()
{
dlgApp = NULL;
}
//消息映射数组,这就比较简洁了,没有宏了.这看得明白些
const QMSG dlgMsgs[] =
{
WM_SYSCOMMAND,&QDialog::OnSysCommand,
WM_COMMAND,&QDialog::OnDlgCommand,
IDC_QUIT_BTN,&QDialog::OnDlgClose,
WM_CLOSE,&QDialog::OnDlgClose,
IDOK,&QDialog::OnIDOK
};
//计算数组大小
int msgCount = sizeof(dlgMsgs) / sizeof(QMSG); INT_PTR CALLBACK QdlgProc(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//因窗口过程函数是全局的,所以这有一个过渡到类的窗口过程函数

dlgApp->dlgProc(dlgHwnd, uMsg, wParam, lParam);
return 0;
}
//在别的地方调用类创建窗口
INT_PTR QDialog::ShowDialog(HWND _pHwnd)
{ return (INT_PTR)::DialogBox(GetModuleHandle(NULL), (LPCTSTR)m_IDD,_pHwnd, QdlgProc);
}

//类的窗口过程函数,和全局的差不多,就是这指针函数前要加的类的对象指针,就这把人弄晕了好久,怎么都
转不过来,放了半个多月,才在今天看了一节虚函数表中寻地址中,那个老师就是这么弄的,

INT_PTR CALLBACK QDialog::dlgProc(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
m_hWind = dlgHwnd;
for (int i=0;i<msgCount;i++)
{
if (uMsg == dlgMsgs[i].uCode)
return (dlgApp->*dlgMsgs[i].Fxn)(dlgHwnd, uMsg, wParam, lParam);
}
return 1;
}

//下面就是各个函数的实现
BOOL QDialog ::OnDlgClose(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
EndDialog(dlgHwnd, 0);
return 1;
} INT_PTR QDialog::OnDlgCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//这条件一定要记得是wParam,不是上面的uMsg了,我自己是复制的,也晕了半天,老是过不了.哈哈.
for (int i = 0; i < msgCount; i++)
{
if (LOWORD(wParam) == dlgMsgs[i].uCode)
return (dlgApp->*dlgMsgs[i].Fxn)(dlgHwnd, uMsg, wParam, lParam);
}
return 1; } BOOL QDialog::OnSysCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
} BOOL QDialog::OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
QWinDlg dlg;
dlg.ShowDialog(winHwnd);
return 0;
}

基本上就是这样了,可以在别的地方调用,这只是弄过了,还有好多还是不足,以后慢慢折腾吧.今天晚了,头也弄

晕了.睡觉了.

下面这图是点OK按钮弹出的对话框,

Dialog封装的消息映射(弄了好久终于弄过了,不是静态函数哦,和MFC一样,嘻嘻)的更多相关文章

  1. MFC消息映射与命令传递

    题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...

  2. 剖析MFC六大关键技术(五六)--消息映射与命令传递

    说到消息,在MFC中,“最熟悉的神秘”可算是消息映射,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样.特别是窗口消息及对消息的处理跟以前 ...

  3. MFC六大核心机制之五、六:消息映射和命令传递

    作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要 ...

  4. 消息映射(C++)(转)

    摘要:控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述,有不对的地方,还希望各路大虾批评指正.     控件通知消息     ...

  5. (二)一个MFC程序,消息映射,纯代码

    1.应用程序类 CWinApp https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cwinapp-class?f1url=https%3A%2F%2 ...

  6. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  7. Android 常用对话框Dialog封装

    Android 6种 常用对话框Dialog封装 包括: 消息对话框.警示(含确认.取消)对话框.单选对话框. 复选对话框.列表对话框.自定义视图(含确认.取消)对话框 分别如下图所示:       ...

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

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

  9. MFC原理第五讲.消息映射.以及如何添加消息

    MFC原理第五讲.消息映射.以及如何添加消息 一丶消息映射是什么 我们知道.Win32程序.都是通过消息去驱动的. 不断的在处理消息. 只要我们使用固定的宏.就可以让我们的框架知道一旦消息发生.该往哪 ...

  10. 【转】MFC消息映射详解(整理转载)

    消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息 ...

随机推荐

  1. 在高通lk中添加自定义源文件

    在高通lk中添加自定义源文件 背景 在lk开发中,需要添加一个自定义功能,但是又不希望代码污染无关的文件(把无关代码添加到某个源文件中是一种罪). 以添加一个aw9523b.c的驱动为例,在aboot ...

  2. gcc系列工具 介绍

    编译器相关知识学习 GNU GCC简介 GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言.多种优化选项并且能够支持分步编译.支持多种反汇编方式.支持多种调试信息格式,目前支持X86. ...

  3. 信奥一本通1164:digit函数

    1164:digit函数 时间限制: 1000 ms 内存限制: 65536 KB 提交数:41504 通过数: 26475 [题目描述] 在程序中定义一函数digit(n,k) ,它能分离出整数n ...

  4. Linux内存不够了?看看如何开启虚拟内存增加内存使用量

    1.为什么要使用虚拟内存 当我们没有多余的钱去购买大内存的云服务器时,但是当前服务器里面的软件和程序运行的比较多导致内存不够用了.这个时候可以通过增加虚拟内存来扩大内存容量.但是在启用虚拟内存时,需要 ...

  5. 嵌入式测试手册——基于NXP iMX6ULL开发板(2)

    基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成.核心板经过专业的PCB Layout ...

  6. 国产自主架构!龙芯2K1000LA工业核心板正式发布!

    国产自主架构!龙芯2K1000LA工业核心板正式发布! 原创 Tronlong创龙科技 Tronlong创龙科技 2024-06-13 07:50 广东 Tronlong创龙科技 ,赞18 (点击视频 ...

  7. 搭建hadoop集群关键步骤--以三节点为例

    搭建三节点的hadoop集群: 要求: 主机名称 备注 IP地址 功能 hadoop01 Master 主节点 192.168.211.134 NameNode.DataNode.ResourceMa ...

  8. SpringBoot整合EasyPoi 封装Excel导出通用工具类,行高自适应,导出图片

    导读 下午抽空封装一个通用导出Excel工具类.之前还写过一篇EasyPoi导入参数校验,批注导出,点我直达 添加依赖 <!-- easy poi --> <dependency&g ...

  9. 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?

    1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...

  10. 可视化—AntV G6实现节点连线及展开收缩分组

    AntV 是蚂蚁金服全新一代数据可视化解决方案,主要包含数据驱动的高交互可视化图形语法G2,专注解决流程与关系分析的图表库 G6.适于对性能.体积.扩展性要求严苛的场景. demo使用数字模拟真实的节 ...