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

[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. Netty(一)IO模型

    1. Netty介绍 Netty 是由JBOSS提供的一个Jave开源框架,是一个异步地.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络IO程序. Netty主要针对在TCP协议下,面向 ...

  2. qt中的 connect 函数

    1.connect()函数实现的是信号与槽的关联. 注意:只有QO bject类及其派生的类才能使用信号和槽的机制 2.函数原型 static QMetaObject::Connection conn ...

  3. python基础-入门必备知识

    1 标识符 标识符是编程时使用的名字,用于给变量.函数.语句块等命名,Python 中标识符由字母.数字.下划线组成,不能以数字开头,区分大小写. 以下划线开头的标识符有特殊含义,单下划线开头的标识符 ...

  4. 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)

    领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...

  5. sqlite相关

    前言 本文记录一些sqlite相关笔记,随时更新. 正文 时间函数 datetime() -- 当前时间 2022-03-24 17:32:43 select datetime('now'); --2 ...

  6. MySQL中为什么要使用索引合并(Index Merge)?

    本文分享自华为云社区<[华为云MySQL技术专栏]MySQL中为什么要使用索引合并(Index Merge)?>,作者:GaussDB 数据库. 在生产环境中,MySQL语句的where查 ...

  7. iOS开发基础109-网络安全

    在iOS开发中,保障应用的网络安全是一个非常重要的环节.以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中 ...

  8. [oeasy]python0067_ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI

    光标位置 回忆上次内容 上次了解了 新的转义模式 \33 逃逸控制字符 esc 这个字符让输出退出标准输出流 进行控制信息的设置 可以设置光标输出的位置 ASR33中的ALT MODE 是 今天的ES ...

  9. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  10. 初读Nginx

    Nginx反向代理:将前端发送的动态请求由Nginx转发到后端服务器 NGINX的好处: 可以缓存,提高访问速度 负载均衡:当请求量过大时,可以按指定方式均衡的分配给集群中的每台服务器 保证后端服务安 ...