文章分类:C++编程
在开发中,大部分情况控件是直接通过rc文件创建的,但也有时候需要在程序中通过CreateWindow来创建控件,下面以Button控件为例说明子类化控件的两种方法。
方法一:使用DDX
方法二:使用SubclassWindow
- class CButtonImpl : public CWindowImpl<CButtonImpl, CButton>
- {
- public:
- CButtonImpl(void)
- {
- }
- ~CButtonImpl(void)
- {
- }
- BEGIN_MSG_MAP(CButtonImpl)
- MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
- DEFAULT_REFLECTION_HANDLER()
- END_MSG_MAP()
- ……
- };
方法一:使用DDX
- class CTestDlg : public CDialogImpl<CTestDlg>, public CWinDataExchange<CTestDlg>
- {
- BEGIN_MSG_MAP(CTestDlg)
- MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
- END_MSG_MAP()
- BEGIN_DDX_MAP(CTestDlg)
- DDX_CONTROL(IDC_BUTTON, m_button)
- END_DDX_MAP()
- ……
- CButtonImpl m_button;
- }
- LRESULT CTestDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- DoDataExchange(FALSE);
- return bHandled = FALSE;
- }
方法二:使用SubclassWindow
- class CTestDlg : public CDialogImpl<CTestDlg>
- {
- BEGIN_MSG_MAP(CTestDlg)
- MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
- END_MSG_MAP()
- ……
- CButtonImpl m_button;
- }
- LRESULT CTestDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- // 程序中创建Button
- HWND hButton = CreateWindow(TEXT("BUTTON"), _T("test"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, m_hWnd, (HMENU)0, hInst, 0);
- // 子类化
- m_button.SubclassWindow(hButton );
- }