自己简单封装的一个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程序设计有所帮助。

(0)

相关推荐

  • C++进程共享数据封装成类实例

    本文实例讲述了C++进程共享数据封装成类的方法,分享给大家供大家参考.具体方法如下: ShareMemory.cpp源文件如下: 复制代码 代码如下: #include "ShareMemory.h"    CShareMemory::CShareMemory(const    char* pszMapName, int nFileSize, BOOL bServer):m_hFileMap(NULL),m_pBuffer(NULL)  {      if (bServer) //是服

  • C++内核对象封装单实例启动程序的类

    复制代码 代码如下: //File Name: Singleton.h#pragma once class Singleton{private:    CString strGUID;    CString strMapFileGUID; HANDLE m_hSingleton; public:    Singleton();    ~Singleton();public:    void AppStart (const HWND & hWnd) const;}; 复制代码 代码如下: //Fi

  • C++选择文件夹代码的封装

    本文实例讲述了C++选择文件夹代码的封装,分享给大家供大家参考.具体方法如下: 该实例分为DirDialog.h头文件与DirDialog.cpp源文件. DirDialog.h头文件代码如下: 复制代码 代码如下: #pragma once  #ifndef __DIRDIALOG_H_HH  #define __DIRDIALOG_H_HH #include <Shlobj.h> class CDirDialog  {  protected:      BROWSEINFO m_bi; 

  • C++实现修改函数代码HOOK的封装方法

    本文实例讲述了C++实现修改函数代码HOOK的封装方法,分享给大家供大家参考.具体实现方法如下: 一.对外的接口如下: 1. 类初始化时对函数HOOK 2. 取消挂钩: void UnHook(); 3. 重新挂钩: void ReHook(); 在初始化时HOOK的代码: 复制代码 代码如下: *(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook; 8个字节的代码地址 0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00  只要把第

  • C++封装线程类的实现方法

    本文实例讲述了C++封装线程类的实现方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // 给主窗口的通知消息  #define WM_CUTTERSTART WM_USER + 100    // wParam == xxx  lParam==xxxx    /*  外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx()   Resumexxx() Stopxxx()  */    /*  m_bContinue在真正的工作代码Do

  • C++封装IATHOOK类实例

    本文实例讲述了C++封装IATHOOK类的实现方法.分享给大家供大家参考.具体方法如下: 1. 定义成类的静态成员,从而实现自动调用 复制代码 代码如下: static CAPIHOOK sm_LoadLibraryA;  static CAPIHOOK sm_LoadLibraryW;  static CAPIHOOK sm_LoadLibraryExA;  static CAPIHOOK sm_LoadLibraryExW;  static CAPIHOOK sm_GetProcAddres

  • C++封装远程注入类CreateRemoteThreadEx实例

    本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考.具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 复制代码 代码如下: // 注入DLL到指定的地址空间 BOOL InjectModuleInto(DWORD dwProcessId); // 从指定的地址空间卸载DLL BOOL EjectModuleFrom(DWORD dwProcessId); .h头文件如下: 复制代码 代码如下: #pragma once 

  • C++动态数组类的封装实例

    C++中的动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构造函数.拷贝构造函数.拷贝赋值运算符.析构函数).运算符的重载.涉及到的知识点很多,对此本文只做简单的介绍. 一.内存分配策略 当用new为一个动态数组申请一块内存时,数组中的元素是连续存储的,例如 vector和string.当向一个动态数组添加元素时,如果没有空间容纳新元素,不可能简单

  • 自己简单封装的一个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; }; publ

  • 简单封装js的dom查询实例代码

    最近一直在啃犀牛书,有感,于是写了个简单的js的dom查询 $ = function (val) { switch(val.charAt(0)) { case '#' : return document.getElementById(val.substring(1)); break; case '.' : val = val.replace('.',''); if(document.getElementsByClassName) return document.getElementsByClas

  • 原生JS实现风箱式demo,并封装了一个运动框架(实例代码)

    声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的框架. function getStyle(obj,attr) { if(obj.currentStyle){ return obj.currentStyle[attr];//为了获取IE下的属性值 }else{ return window.getComputedStyle(obj,null)[at

  • C#封装的Sqlite访问类实例

    本文实例讲述了C#封装的Sqlite访问类.分享给大家供大家参考.具体分析如下: C#封装的Sqlite访问类,要访问Sqlite这下简单了,直接调用此类中的方法即可 using System; using System.Collections; using System.Collections.Specialized; using System.Data; using System.Configuration; using System.Data.SQLite; namespace DAL {

  • javascript封装的sqlite操作类实例

    本文实例讲述了javascript封装的sqlite操作类.分享给大家供大家参考.具体如下: function sql(name,v,desc,size,tables){ this.db=null; this.name=name; this.v=v; this.desc=desc; this.size=size; this.tables=tables; this.ini(); } sql.prototype.ini=function(){ var self=this; self.db=openD

  • PHP封装的Twitter访问类实例

    本文实例讲述了PHP封装的Twitter访问类.分享给大家供大家参考.具体如下: class Twitter { /** * Method to make twitter api call for the users timeline in XML * * @access private * @param $twitter_id, $num_of_tweets * @return $xml */ private function api_call($twitter_id, $num_of_twe

  • 如何封装了一个vue移动端下拉加载下一页数据的组件

    前言 简单封装了一个vue下拉加载组件,分享一下,已放到github和前端资源库,欢迎下载! 组件代码 <template> <div class="my-scroll" :class="[scrollState?'prohibit':'allow']" ref="myScroll" @scroll.passive="onScroll($event)" @touchmove="onScroll($e

  • 基于python生成器封装的协程类

    自从python2.2提供了yield关键字之后,python的生成器的很大一部分用途就是可以用来构建协同程序,能够将函数挂起返回中间值并能从上次离开的地方继续执行.python2.5的时候,这种生成器更加接近完全的协程,因为提供了将值和异常传递回到一个继续执行的函数中,当等待生成器的时候,生成器能返回控制. python提供的生成器设施: yield:能够将自己挂起,并提供一个返回值给等待方 send:唤起一个被挂起的生成器,并能够传递一个参数,可以在生成器中抛出异常 next:本质上相当于s

  • android实现okHttp的get和post请求的简单封装与使用

    由于Android课程项目需要,特地查阅了okHttp的使用,发现网上找的大多和自己的需求不一样.所以就着团队项目需要,自己简单封装了一个okHttp的get和post请求. 话不多说,直接看代码吧! 一.前期需要用到的属性封装 private static Request request = null; private static Call call = null; private static int TimeOut = 120; //单例获取ohttp3对象 private static

  • python使用线程封装的一个简单定时器类实例

    本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = None def _do_func(self): if self._fn: self._fn() self._do_start() def _do_start(self): self.

随机推荐