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

[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. Ubuntu 下 python 安装pip

    背景 python的强大在于它的第三方库. 安装 python2 sudo apt-get install python-pip python3 curl https://bootstrap.pypa ...

  2. 缩小50%,Mini版T3/A40i核心板,让您的设备更小巧!

    小尺寸核心板给用户带来何种价值? 创龙科技常收到用户对于小尺寸核心板的需求反馈,尤其在电力数据采集器.电力DTU.电力通讯管理机.运动控制器.工业HMI.工业网关等工业设备中. 小尺寸核心板3大优势将 ...

  3. WIN 11 共享设置

    我的电脑 -> 管理 -> 用户 -> 解除 GUEST 禁用 gpedit.msc -> 计算机管理 -> 本地 -> 从网络上访问本机 -> 允许GUES ...

  4. 推荐一款Python接口自动化测试数据提取分析神器!

    1.引言 在处理JSON数据时,我们常常需要提取.筛选或者变换数据.手动编写这些操作的代码不仅繁琐,而且容易出错.Python作为一个功能强大的编程语言,拥有丰富的库和工具来处理这些数据.今天,将介绍 ...

  5. SQL Server 截取字符串

    select top 100 substring(qr_code,8,8) ,* from [LiuJun_PKh_lcfc_hf] --where right(ri,8) or substring( ...

  6. oeasy教您玩转vim - 61- # 编辑过程

    ​ 编辑过程 回忆上次 vi可以加各种参数 vi +4 oeasy.txt vi +/shiyanlou vi +%s/shiyanlou/oeasy/g oeasy.txt vi可以接收stdin的 ...

  7. AS上的基础中级控件-图形定制

    图形Drawable 1.Drawable表达包含了图片色块画布背景等 2.存在res中的Drawable目录下,保存描述性的XML文件 3.各种视图都可以使用该控件如ViewText,Button, ...

  8. 【TypeScript】01 基础入门

    前提:使用TypeScript你需要安装NodeJS支持 然后安装TypeScript: npm intsall -g typescript 安装完成后查看版本号: tsc -v 新建一个TypeSc ...

  9. 从.net开发做到云原生运维(三)——.net core的学习路线

    1. 前言 前面几篇文章主要讲了.net技术相关的基本概念和一些涉及的项目什么,本身也没讲太多底层的技术,这篇文章依旧不讲具体的技术,主要介绍.net技术的学习路线.学习路线也是我18年毕业的时候看到 ...

  10. ECMO(体外膜氧合)的使用费用为什么会这么高?

    给一个大致的费用: 相关: https://www.bilibili.com/video/BV1rc411H7uT/ https://haokan.baidu.com/v?pd=wisenatural ...