3.3.3 WTL对话框和控件自定义

第一种通过Attack

	HWND hWnd = GetDlgItem(IDC_LIST1);m_list.Attach(hWnd);hWnd = GetDlgItem(IDC_EDIT1);m_edit.Attach(hWnd);m_edit.SetWindowText(_T("hell wolrd "));

第二种通过窗口子类化

m_btnOk.SubclassWindow(GetDlgItem(IDOK));// 对窗口子类化。m_btnCacel.SubclassWindow(GetDlgItem(IDCANCEL));

第三种通过之类继承

template<LPCTSTR res>
class CTCButton :public CWindowImpl<CTCButton<res>,CButton>
{
public:BEGIN_MSG_MAP_EX(CTCButton)MSG_WM_SETCURSOR(OnSetCursorOK)//stdafx.h 加头文件   没有一样的可以不写 可能 END_MSG_MAP()LRESULT OnSetCursorOK(HWND hWnd, UINT uHitTest, UINT uMsg){/*SetMsgHandled(false) 让消息通过CHAIN_MSG_MAP宏链入基类,这个调用代替了 ATL宏使用的bHandled参数。SetMsgHandled(TRUE) 让消息不同流入基类进行处理*/static HCURSOR hcur = LoadCursor(NULL, res);if (hcur != NULL){SetCursor(hcur);return TRUE;}else{SetMsgHandled(False);return false;}return 0;}
};

第四种通过DDX

class CTCEdit:public CWindowImpl<CTCEdit,CEdit>
{
public:BEGIN_MSG_MAP_EX(CTCEdit)MSG_WM_CONTEXTMENU(OnContextMenu)  //有键资源 END_MSG_MAP()void OnContextMenu(HWND, CPoint pt){MessageBox(_T("Menu done!"));}
};

主代码

class CMainDlg : public CDialogImpl<CMainDlg>,public CWinDataExchange<CMainDlg>//DDX 需要
{
public:CMainDlg() :m_btnOk(this,1), m_btnCacel(this,2){;}BEGIN_DDX_MAP(CMainDlg)DDX_CONTROL(IDC_EDIT2, m_edit2)   END_DDX_MAP()enum { IDD = IDD_MAINDLG };BEGIN_MSG_MAP_EX(CMainDlg)MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)COMMAND_ID_HANDLER(IDOK, OnOK)COMMAND_ID_HANDLER(IDCANCEL, OnCancel)ALT_MSG_MAP(1)MSG_WM_SETCURSOR(OnSetCursorOK)//stdafx.h 加头文件 ALT_MSG_MAP(2)MSG_WM_SETCURSOR(OnSetCursorCancel)END_MSG_MAP()// Handler prototypes (uncomment arguments if needed)://	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/){// center the dialog on the screenCenterWindow();// set iconsHICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));SetIcon(hIcon, TRUE);HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));SetIcon(hIconSmall, FALSE);HWND hWnd = GetDlgItem(IDC_LIST1);m_list.Attach(hWnd);hWnd = GetDlgItem(IDC_EDIT1);m_edit.Attach(hWnd);m_edit.SetWindowText(_T("hell wolrd "));m_btnOk.SubclassWindow(GetDlgItem(IDOK));// 对窗口子类化。m_btnCacel.SubclassWindow(GetDlgItem(IDCANCEL));m_btnAbout.SubclassWindow(GetDlgItem(ID_APP_ABOUT));DoDataExchange(FALSE);//绑定Edit2return TRUE;}LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){CSimpleDialog<IDD_ABOUTBOX, FALSE> dlg;dlg.DoModal();return 0;}LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/){// TODO: Add validation code EndDialog(wID);return 0;}LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/){EndDialog(wID);return 0;}LRESULT OnSetCursorOK(HWND hWnd,UINT uHitTest,UINT uMsg){/*SetMsgHandled(false) 让消息通过CHAIN_MSG_MAP宏链入基类,这个调用代替了 ATL宏使用的bHandled参数。SetMsgHandled(TRUE) 让消息不同流入基类进行处理*/static HCURSOR hcur = LoadCursor(NULL, IDC_HAND);if (hcur != NULL){SetCursor(hcur);return TRUE;}else{SetMsgHandled(False);return false;	}return 0;}LRESULT OnSetCursorCancel(HWND hWnd, UINT uHitTest, UINT uMsg){static HCURSOR hcur = LoadCursor(NULL, IDC_NO);if (hcur != NULL){SetCursor(hcur);return TRUE;}else{SetMsgHandled(False);return false;}return 0;}protected:CListViewCtrl m_list;CEdit m_edit;CContainedWindow m_btnOk;CContainedWindow m_btnCacel;CTCButton<IDC_HELP> m_btnAbout;CTCEdit m_edit2;
};


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部