WTL 学习笔记 -- ResizeDialog
记得以前写过一个ActiveX控件,只要把它放在对话框上,它遍历对话框上的所有控件,并把它们管理起来,只要对话框大小变化时,它自动调整各个控件的大小和位置。这可能是我写的第一个ActiveX控件,比较失败,虽然功能实现了,但只是无条件的缩放控件的大小和位置,结果是有的控件变得很难看。
WTL里已经内置这种功能,不用我们自己实现了。它提供了一个CdialogResize类,帮助实现自动调整对话框上控件的大小和位置。这个功能很好用,简单有效。可以按下列步骤进行:
1. 让对话框从CdialogResize类继承过来:
class CMainDlg : public CDialogImpl<CMainDlg>, public CDialogResize<CMainDlg> |
2. 定义自动调整大小的控件列表
BEGIN_DLGRESIZE_MAP(CMainDlg) DLGRESIZE_CONTROL(IDC_LIST, DLSZ_SIZE_Y ) DLGRESIZE_CONTROL(IDC_EDIT, DLSZ_SIZE_X | DLSZ_SIZE_Y) DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X) DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X) DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X) END_DLGRESIZE_MAP() |
3. 在消息处理中加入消息转发功能
BEGIN_MSG_MAP(CMainDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) COMMAND_ID_HANDLER(IDOK, OnOK) COMMAND_ID_HANDLER(IDCANCEL, OnCancel) CHAIN_MSG_MAP(CDialogResize<CMainDlg>) END_MSG_MAP() |
4. 在OnInitDialog里做点初始化工作
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { // center the dialog on the screen CenterWindow();
// set icons HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); SetIcon(hIcon, TRUE); HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); SetIcon(hIconSmall, FALSE);
ATLASSERT(GetDlgItem(IDOK) != NULL); ATLASSERT(GetDlgItem(ID_APP_ABOUT) != NULL);
DlgResize_Init(); return TRUE; } |
OK,搞定!