직접 포장된 CDialog 클래스 인스턴스

4074 단어
본고의 실례는 자신이 간단하게 포장한 CDialog 종류의 실례를 설명한다.여러분에게 참고하도록 공유하다.구체적으로 다음과 같다.
이 코드는 비교적 짧아서 메시지 매핑을 실현하였다.
Dialog.h 헤더 파일은 다음과 같습니다.

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

사용할 때 이 두 개의 파일을 포함하고 자원 편집기로Dialog를 만든 다음에 클래스를 직접 써서 제 CDialog 클래스를 계승하고 mwRes 이 구성원은 당신이 만든Dialog의 ID를 변경하고 extern의 전역 변수 mpThis하고 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 프로그램 설계에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기