自定义窗口尺寸管理框架移植与应用

在软件开发过程中,经常需要对窗口的尺寸进行自定义管理,以适应不同的用户界面需求。虽然市面上存在一些图形用户界面框架,但它们可能并不完全符合需求。因此,决定将Paul DiLascia在2001年7月的MSDN杂志上发表的优秀框架WinMgr移植到项目中。

要理解这个框架的所有原理,请务必阅读原始文章。移植过程几乎是直接的,只是在对话框中添加了调整大小的手柄。

使用框架

要使用这个框架,首先需要将以下文件添加到项目中:

  • WinMgr.h
  • WinMgr.cpp
  • WinRect.cpp
  • SizeableDlg.h

然后,对话框需要继承自类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 { // ... }

现在,可以享受自定义尺寸对话框了。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485