自己簡單封裝的一個(gè)CDialog類實(shí)例
本文實(shí)例講述了自己簡單封裝的一個(gè)CDialog類實(shí)例。分享給大家供大家參考。具體如下:
該代碼比較短小,實(shí)現(xiàn)了消息映射。
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;
//窗口過程函數(shù)
INT_PTR CDialog::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//遍歷消息列表以查找是否有相應(yīng)的響應(yīng)函數(shù)
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;
}
//創(chuàng)建消息列表
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;
}
//消息響應(yīng)函數(shù)
bool CDialog::OnClose(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
EndDialog(hwndDlg,0);
return true;
}
CDialog::CDialog()
{
InitMap();
}
//程序入口函數(shù)
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;
}
//由子類重寫此函數(shù)以在對話框初始化時(shí)進(jìn)行一些操作
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;
}
使用時(shí),只需要把這2個(gè)文件包含進(jìn)去,用資源編輯器創(chuàng)建一個(gè)Dialog,然后再自己寫一個(gè)類,繼承我的CDialog類,把m_wRes這個(gè)成員變更設(shè)為你創(chuàng)建的Dialog的ID,再extern一個(gè)全局變量m_pThis并把this指針賦給它就可以了。
要增加消息響應(yīng)函數(shù)的話,只要在你的類的構(gòu)造函數(shù)里調(diào)用AddMsg()這個(gè)函數(shù),然后再寫你的消息響應(yīng)函數(shù)就好了。
AddMsg有兩個(gè)參數(shù),第一個(gè)參數(shù)是你的消息響應(yīng)函數(shù)名,第二個(gè)參數(shù)是你要響應(yīng)的消息。
示例如下:
#include "MyDlg.h"
#include "resource.h"
//定義一個(gè)指向CDialog的指針并在下面的構(gòu)造函數(shù)中賦值為this
extern CDialog* pThis;
MyDlg App;
MyDlg::MyDlg()
{
m_wRes = IDD_DIALOG1;
pThis = this;
AddMsg(OnCommand,WM_COMMAND);
}
//WM_COMMAND消息響應(yīng)函數(shù)
bool MyDlg::OnCommand(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
MessageBox(hwndDlg,"","",0);
return true;
}
//WM_INITDIALOG消息響應(yīng)函數(shù)
bool MyDlg::OnInit(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
MessageBox(hwndDlg,"","",0);
return true;
}
希望本文所述對大家基于MFC的win32程序設(shè)計(jì)有所幫助。
相關(guān)文章
項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫連接池
這篇文章主要介紹了項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫連接池問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
C++中產(chǎn)生臨時(shí)對象的情況及其解決方案
這篇文章主要介紹了C++中產(chǎn)生臨時(shí)對象的情況及其解決方案,以值傳遞的方式給函數(shù)傳參,類型轉(zhuǎn)換以及函數(shù)需要返回對象時(shí),并給對應(yīng)給出了詳細(xì)的解決方案,通過圖文結(jié)合的方式講解的非常詳細(xì),需要的朋友可以參考下2024-05-05
C++11?nullptr實(shí)現(xiàn)初始化空指針
避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時(shí)完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下2022-01-01
C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下2023-01-01
c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算
這篇文章主要介紹了c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算,需要的朋友可以參考下2014-05-05

