65.9K
CodeProject 正在变化。 阅读更多。
Home

大小调整框架

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2001 年 10 月 16 日

1分钟阅读

viewsIcon

58877

downloadIcon

945

移植自 Paul DiLascia 的窗口大小调整框架。

Sample Image - sizingframework.jpg

引言

WTL 提供了构建大型图形用户界面的可能性,但它并不完全符合我的需求,所以我决定移植 Paul DiLascia 在 MSDN Magazine 2001年7月号 上发表的优秀框架“Windows UI: Our WinMgr Sample Makes Custom Window Sizing Simple”。要理解该框架的所有原理,请阅读原文。

移植过程几乎是直接的。我只是在对话框中添加了抓手。

用法

要使用该框架,首先需要将这些文件添加到您的项目中
  • WinMgr.h
  • WinMgr.cpp
  • WinRect.cpp
  • SizeableDlg.h
然后,您的对话框需要从 CDialogSizeable 类继承,如下所示
    class CTestDlg : 
        public CDialogSizeable<CTestDlg>,
        public CDialogImpl<CTestDlg>
OnInitDialog() 事件处理程序中,添加以下代码作为第一行
    LRESULT CTestDlg::OnInitDialog( HWND hwnd, LPARAM  lParam)
    {
        BOOL bRet = CDialogSizeable<CTestDlg>::OnInitDialog( hwnd, lParam );
        ...
    }
将以下宏添加到您的主消息映射中
    BEGIN_MSG_MAP_EX(CTestDlg)
        ...
        MESSAGE_HANDLER_EX(WM_WINMGR, OnWinMgr)
        ...
    END_MSG_MAP()
并将该方法添加到您的对话框类中(有关更多信息,请参阅原文)
    ///////////////////

    // Handle WM_WINMGR: return min size for OK/Cancel buttons

    //

    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<CTestDlg>( TestDlgMap )
    {
        ...
现在,享受您的可调整大小的对话框吧。

遇到的问题

目前没有(;-)。

历史

版本 1.00 2001年10月8日
将文章提交到 Codeproject 网站。
将文章添加到 Tech Head 网站。
© . All rights reserved.