自己簡單封裝的一個CDialog類

來源:互聯網
上載者:User

代碼比較短小,實現了訊息映射。

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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.