WTL中如何子类化控件(转帖)

来源:互联网 发布:上海行知教育 英语培训 编辑:程序博客网 时间:2024/06/08 10:35

文章分类:C++编程

在开发中,大部分情况控件是直接通过rc文件创建的,但也有时候需要在程序中通过CreateWindow来创建控件,下面以Button控件为例说明子类化控件的两种方法。
C++代码 复制代码
  1.     
  2. class CButtonImpl : public CWindowImpl<CButtonImpl, CButton>     
  3. {     
  4. public:     
  5.     CButtonImpl(void)     
  6.     {     
  7.     }     
  8.      
  9.     ~CButtonImpl(void)     
  10.     {     
  11.     }     
  12.      
  13.     BEGIN_MSG_MAP(CButtonImpl)     
  14.         MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)     
  15.         DEFAULT_REFLECTION_HANDLER()     
  16.     END_MSG_MAP()     
  17.      
  18. ……     
  19.      
  20. };   


方法一:使用DDX
C++代码 复制代码
  1.     
  2. class CTestDlg : public CDialogImpl<CTestDlg>, public CWinDataExchange<CTestDlg>     
  3. {     
  4.     BEGIN_MSG_MAP(CTestDlg)     
  5.         MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)     
  6.     END_MSG_MAP()     
  7.      
  8.     BEGIN_DDX_MAP(CTestDlg)     
  9.         DDX_CONTROL(IDC_BUTTON,  m_button)     
  10.     END_DDX_MAP()     
  11.      
  12. ……     
  13.      
  14.     CButtonImpl m_button;     
  15. }     
  16.      
  17. LRESULT CTestDlg::OnInitDialog(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)     
  18. {     
  19.     DoDataExchange(FALSE);     
  20.     return bHandled = FALSE;     
  21. }  
 

方法二:使用SubclassWindow
C++代码 复制代码
  1.     
  2. class CTestDlg : public CDialogImpl<CTestDlg>     
  3. {     
  4.     BEGIN_MSG_MAP(CTestDlg)     
  5.         MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)     
  6.     END_MSG_MAP()     
  7.      
  8. ……     
  9.      
  10.     CButtonImpl m_button;     
  11. }     
  12.      
  13. LRESULT CTestDlg::OnInitDialog(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)     
  14. {     
  15.     // 程序中创建Button     
  16.     HWND hButton = CreateWindow(TEXT("BUTTON"), _T("test"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, m_hWnd, (HMENU)0, hInst, 0);     
  17.     // 子类化     
  18.     m_button.SubclassWindow(hButton );     
  19. }  
原创粉丝点击