本文實例講述了自己簡單封裝的一個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;}//顯示Dialogbool 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"http://定義一個指向CDialog的指針并在下面的構造函數中賦值為thisextern 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程序設計有所幫助。
新聞熱點
疑難解答
圖片精選