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

EasySize - 立刻实现对话框大小调整!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (207投票s)

2001年12月11日

4分钟阅读

viewsIcon

1189657

downloadIcon

28024

一种使用少量宏在可调整大小的对话框或属性页中定位控件的简单方法

引言

您是否曾经想过,花大量时间为您的简单应用程序做一个基本的GUI,而不是专注于实际的“内容”,实际上有多么令人讨厌?例如,一个可调整大小的对话框或属性页。您需要为每个控件编写代码,告诉它在调整大小时应该去哪里,这会花费大量时间。现在我知道我不是第一个提供解决方案的人 (CResizableDialog),但这篇文章是关于我的方法的。

描述

基本上,您需要做的就是按照您希望的方式在资源编辑器中设计您的对话框(不要忘记使其可调整大小),然后使用每个控件的单个宏来定义调整对话框大小时控件的行为。

用法

请注意,所有这些在CDialogCPropertyPage中的工作方式完全相同

  1. #include EasySize.h 到您的 stdafx.h (或者将其放在您的include 目录中,并 #include <EasySize.h>,我推荐这样做)。
  2. 在您的类声明中的任何位置添加 DECLARE_EASYSIZE
    class CEasySizeDemoDlg : public CDialog
    {
    DECLARE_EASYSIZE
    ...
  3. 如果 OnInitDialog 处理程序尚不存在,则创建一个,并将其放在末尾:“INIT_EASYSIZE;
    BOOL CEasySizeDemoDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
    ...    
        INIT_EASYSIZE;
        return TRUE; // return TRUE  unless you set the focus to a control
    } 
  4. 创建一个 OnSize 处理程序,并将 UPDATE_EASYSIZE; 宏添加到其中
    void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) 
    {
        CDialog::OnSize(nType, cx, cy);
        UPDATE_EASYSIZE;
    } 
  5. 可选 - 如果您希望您的对话框具有最小尺寸,则创建一个 OnSizing 处理程序,并按如下所示添加 EASYSIZE_MINSIZE
    void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect) 
    {
        CDialog::OnSizing(fwSide, pRect);
        EASYSIZE_MINSIZE(280,250,fwSide,pRect);
    }
    //(in this example, 280 is the minimum width and 250 the 
    //minimum height we want our dialog to have)
  6. 现在您必须创建“EasySize Map”(或您想调用的任何名称),您将在其中指定每个对话框项的行为。它可以放置在类实现的任何位置。该映射看起来像这样
    BEGIN_EASYSIZE_MAP(class_name)
        ...
        EASYSIZE(control,left,top,right,bottom,options)
        ...
    END_EASYSIZE_MAP

    演示应用程序中的映射看起来像这样

    ...
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
        EASYSIZE(IDC_TITLE,ES_BORDER,ES_BORDER,
            ES_BORDER,ES_KEEPSIZE,ES_HCENTER)
        EASYSIZE(IDC_RADIO1,ES_BORDER,ES_BORDER,
            ES_KEEPSIZE,ES_KEEPSIZE,0)
        EASYSIZE(IDC_RADIO2,ES_BORDER,ES_BORDER,
            ES_KEEPSIZE,ES_KEEPSIZE,0)
        EASYSIZE(IDC_CONTENT,ES_BORDER,ES_BORDER,
            ES_BORDER,ES_BORDER,0)
        EASYSIZE(IDC_STATUSFRAME,ES_BORDER,ES_KEEPSIZE,
            ES_BORDER,ES_BORDER,0)
        EASYSIZE(IDC_STATUS,ES_BORDER,ES_KEEPSIZE,
            ES_BORDER,ES_BORDER,0)
        EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,
            ES_BORDER,ES_BORDER,0)
        EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,
            ES_BORDER,ES_BORDER,0)
        EASYSIZE(IDC_MYICON1,ES_BORDER,IDC_RADIO2,IDC_CONTENT,
            IDC_STATUSFRAME,ES_HCENTER|ES_VCENTER)
        EASYSIZE(IDC_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,
            ES_KEEPSIZE,ES_HCENTER)
    END_EASYSIZE_MAP
    
    ///////////////////////////////////////////////////////////////
    // CEasySizeDemoDlg message handlers
    ...

看起来令人困惑?一旦你明白了这一点就不是了(我知道我不擅长解释它)。请继续阅读。

EASYSIZE 宏

EASYSIZE 宏用于 EasySize Map 中,以指定您的控件在对话框大小调整时将具有的行为。它看起来像这样

EASYSIZE(control,left,top,right,bottom,options)

control 是您要重新定位的对话框项的 ID(在下文中将被称为“当前控件”)。

left, top, right 和 bottom 可以是对话框中另一个控件的 ID(不是当前控件),也可以是特殊值 ES_BORDERES_KEEPSIZE 之一。

基本上,如果您指定一个 ID,则从当前控件到由 ID 指定的项的距离在调整对话框大小时将保持不变:当前控件将“粘附”到另一项。 ES_BORDER 的工作方式与您指定控件 ID 的方式相同,只是它将保持当前控件和对话框边框之间的距离恒定。在例如 left 中指定 ES_KEEPSIZE 将保持当前控件的宽度相同,并将使当前控件与您在 right 中指定的任何内容右对齐。当前控件的宽度(或高度,如果您在 topbottom 中指定了 ES_KEEPSIZE)将始终保持其在对话框资源中的大小。(我知道这个解释很糟糕,但如果您感到困惑,请查看演示应用程序或在下面的讨论区中发布您的问题)。显然,不能在 "leftright" "topbottom" 中同时指定 ES_KEEPSIZE

options 可以是 ES_HCENTERES_VCENTER 和 0 的组合(如果您不想要其他任何一个,则使用 0)。 ES_HCENTER 水平居中于 leftright 中指定的两个项目之间(两者都不能是 ES_KEEPSIZE!)。当前控件的宽度将始终与其在对话框资源中相同。 ES_VCENTER 的工作方式相同,但用于垂直居中(使用 topbottom,并且高度将保持不变)。

结论

好吧,我希望你弄清楚它是如何工作的,因为它真的可以使你的生活更轻松。请注意,使用这些宏可能会使您编译后的代码略大于手动编写调整大小例程的代码,但在大多数情况下,这种变化非常小,您甚至不会注意到。

历史

  • 2001 年 12 月 11 日:初始版本

上次更新 - 只是更正了一些错别字

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.