自己简单封装的一个CDialog类实例

 更新时间:2015年04月20日 10:35:21   作者:司青  
这篇文章主要介绍了自己简单封装的一个CDialog类,实例分析了自定义封装CDialog类的相关技巧,比较简单易懂,需要的朋友可以参考下

本文实例讲述了自己简单封装的一个CDialog类实例。分享给大家供大家参考。具体如下:

该代码比较短小,实现了消息映射。

Dialog.h头文件如下:

#include <windows.h>
class CDialog
{
public:
 //一条消息所包含的信息
 struct MAP
 {
  UINT Msg;
  bool (*pf)(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
  int len;
  MAP *pNext;
 };
public:
 WORD m_wRes;//Dialog资源的ID
 //头、尾指针,用来操作消息列表
 static MAP *m_pHead;
 MAP *m_pEnd;
public:
 bool Show(HINSTANCE,HWND);
 void AddMsg(bool (*fp)(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam),UINT);
 static bool OnClose(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 static bool OnInit(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 CDialog();
private:
 static INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 void InitMap();
};
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);

Dialog.cpp源文件如下:

#include "Dialog.h"
CDialog* pThis;//保存基类指针
CDialog::MAP* CDialog::m_pHead = NULL;
//窗口过程函数
INT_PTR CDialog::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 //遍历消息列表以查找是否有相应的响应函数
 CDialog::MAP* pTemp = m_pHead;
 for(int i = 1;i <= m_pHead->len;++i)
 {
  if(uMsg == pTemp->Msg)
  {
   pTemp->pf(hwndDlg,uMsg,wParam,lParam);
   return FALSE;
  }
  pTemp = pTemp->pNext;
 }
 return FALSE;
}
//创建消息列表
void CDialog::InitMap()
{
 m_pHead = new MAP;
 m_pHead->len = 2;
 m_pHead->Msg = WM_CLOSE;
 m_pHead->pf = OnClose;
 MAP *pNew = new MAP;
 pNew->Msg = WM_INITDIALOG;
 pNew->pf = OnInit;
 pNew->pNext = NULL;
 m_pHead->pNext = pNew;
 m_pEnd = pNew;
}
//消息响应函数
bool CDialog::OnClose(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 EndDialog(hwndDlg,0);
 return true;
}
CDialog::CDialog()
{
 InitMap();
}
//程序入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 pThis->Show(hInstance,NULL);
 return 0;
}
//显示Dialog
bool CDialog::Show(HINSTANCE hIns,HWND hParent)
{
 DialogBox(hIns,MAKEINTRESOURCE(m_wRes),hParent,DialogProc);
 return true;
}
//由子类重写此函数以在对话框初始化时进行一些操作
bool CDialog::OnInit(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 return true;
}
//向消息列表中增加消息
void CDialog::AddMsg(bool (*fp)(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam),UINT uMsg)
{
 MAP *pNew = new MAP;
 pNew->Msg = uMsg;
 pNew->pf = fp;
 pNew->pNext = NULL;
 m_pEnd->pNext = pNew;
 m_pEnd = pNew;

 ++m_pHead->len;
}

使用时,只需要把这2个文件包含进去,用资源编辑器创建一个Dialog,然后再自己写一个类,继承我的CDialog类,把m_wRes这个成员变更设为你创建的Dialog的ID,再extern一个全局变量m_pThis并把this指针赋给它就可以了。

要增加消息响应函数的话,只要在你的类的构造函数里调用AddMsg()这个函数,然后再写你的消息响应函数就好了。

AddMsg有两个参数,第一个参数是你的消息响应函数名,第二个参数是你要响应的消息。

示例如下:

#include "MyDlg.h"
#include "resource.h"
//定义一个指向CDialog的指针并在下面的构造函数中赋值为this
extern CDialog* pThis;
MyDlg App;
MyDlg::MyDlg()
{
 m_wRes = IDD_DIALOG1;
 pThis = this;
 AddMsg(OnCommand,WM_COMMAND);
}
//WM_COMMAND消息响应函数
bool MyDlg::OnCommand(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 MessageBox(hwndDlg,"","",0);
 return true;
}
//WM_INITDIALOG消息响应函数
bool MyDlg::OnInit(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 MessageBox(hwndDlg,"","",0);
 return true;
}

希望本文所述对大家基于MFC的win32程序设计有所帮助。

相关文章

  • 深入探究C++ string的内部究竟是什么样的

    深入探究C++ string的内部究竟是什么样的

    这篇文章主要给大家介绍了关于C++ string的内部究竟是什么样的,文中通过示例代码的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C语言中各种操作符的详细介绍(纯干货!)

    C语言中各种操作符的详细介绍(纯干货!)

    指令系统的每一条指令都有一个操作符,它表示该指令应进行什么样性质的操作,不同的指令用操作符这个字段的不同编码来表示,每个编码代表一种指令,这篇文章主要给大家介绍了关于C语言中操作符的相关资料,需要的朋友可以参考下
    2021-06-06
  • C++实现简易的通讯录管理系统

    C++实现简易的通讯录管理系统

    这篇文章主要为大家详细介绍了C++实现简易的通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中register关键字举例详解

    C++中register关键字举例详解

    register用来声明变量,然后声明出来的变量是直接放在cpu的寄存器当中,而非就是通过内存寻址访问,这样效率更高,下面这篇文章主要给大家介绍了关于C++中register关键字的相关资料,需要的朋友可以参考下
    2023-03-03
  • C++11中的可变参数模板/lambda表达式

    C++11中的可变参数模板/lambda表达式

    C++11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板,相比C++98和C++03,类模板和函数模板中只能含固定数量的模板参数,可变参数模板无疑是一个巨大的改进,这篇文章主要介绍了C++11中的可变参数模板/lambda表达式,需要的朋友可以参考下
    2023-03-03
  • c++ 如何在libuv中实现tcp服务器

    c++ 如何在libuv中实现tcp服务器

    这篇文章主要介绍了c++ 如何在libuv中实现tcp服务器,帮助大家更好的理解和使用libuv,感兴趣的朋友可以了解下
    2021-02-02
  • C++ map与set封装实现过程讲解

    C++ map与set封装实现过程讲解

    set set是一种关联式容器,下面这篇文章主要给大家介绍了关于C++中map和set使用的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • Qt QChart 创建图表的实现方法

    Qt QChart 创建图表的实现方法

    这篇文章主要介绍了Qt QChart 创建图表的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • QT 中文乱码解决汇总(QString与string、char*互转乱码)

    QT 中文乱码解决汇总(QString与string、char*互转乱码)

    在QT中使用中文时,经常会碰到论码问题,本文主要介绍了QT 中文乱码解决汇总(QString与string、char*互转乱码),需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 基于C语言实现个人通讯录管理系统

    基于C语言实现个人通讯录管理系统

    这篇文章主要为大家详细介绍了基于C语言实现个人通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06

最新评论