代碼比較短小,實現了訊息映射。
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"
//定義一個指向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;}