在软件开发过程中,经常需要对窗口的尺寸进行自定义管理,以适应不同的用户界面需求。虽然市面上存在一些图形用户界面框架,但它们可能并不完全符合需求。因此,决定将Paul DiLascia在2001年7月的MSDN杂志上发表的优秀框架WinMgr移植到项目中。
要理解这个框架的所有原理,请务必阅读原始文章。移植过程几乎是直接的,只是在对话框中添加了调整大小的手柄。
要使用这个框架,首先需要将以下文件添加到项目中:
然后,对话框需要继承自类CDialogSizeable,如下所示:
class CTestDlg : public CDialogSizeable, public CDialogImpl {
// ...
};
在OnInitDialog()事件处理程序中,添加以下代码作为第一行:
LRESULT CTestDlg::OnInitDialog(HWND hwnd, LPARAM lParam) {
BOOL bRet = CDialogSizeable::OnInitDialog(hwnd, lParam);
// ...
}
在主消息映射中添加以下宏:
BEGIN_MSG_MAP_EX(CTestDlg)
// ...
MESSAGE_HANDLER_EX(WM_WINMGR, OnWinMgr)
// ...
END_MSG_MAP()
并将以下方法添加到对话框类中(更多信息请参考原始文章):
LRESULT CTestDlg::OnWinMgr(UINT uMsg, WPARAM wp, LPARAM lp) {
ATLASSERT(lp);
NMWINMGR& nmw = *(NMWINMGR*)lp;
if (nmw.code == NMWINMGR::GET_SIZEINFO) {
if (wp == IDOK || wp == IDCANCEL) {
nmw.sizeinfo.szMin = m_szMinButton;
return TRUE;
}
}
return 0;
}
在对话框类的cpp文件中构建窗口映射,例如:
BEGIN_WINDOW_MAP(TestDlgMap)
BEGINROWS(WRCT_REST, 0, RCMARGINS(8, 8))
BEGINCOLS(WRCT_REST, 0, 0)
BEGINROWS(WRCT_REST, 4, RCMARGINS(-4, -4))
RCTOFIT(IDC_STATIC1)
RCSPACE(-4)
BEGINROWS(WRCT_TOFIT, IDC_GROUP1, RCMARGINS(-8, -8))
RCSPACE(-10)
RCTOFIT(IDC_RADIO1)
RCTOFIT(IDC_RADIO2)
ENDGROUP()
ENDGROUP()
RCPERCENT(IDC_EDIT1, 50)
ENDGROUP()
RCSPACE(-4)
RCTOFIT(IDC_STATIC2)
RCTOFIT(IDC_SLIDER1)
BEGINCOLS(WRCT_TOFIT, 0, 0)
RCREST(-1)
BEGINROWS(WRCT_TOFIT, 0, 0)
RCTOFIT(IDOK)
RCSPACE(-2)
RCTOFIT(IDCANCEL)
ENDGROUP()
ENDGROUP()
ENDGROUP()
END_WINDOW_MAP()
最后,在对话框的构造函数中添加以下代码:
CTestDlg::CTestDlg() : CDialogSizeable {
// ...
}
现在,可以享受自定义尺寸对话框了。