EasySize - Dialog resizing in no time!

效果图:



Introduction

你曾今是否对花很多时间在基础 GUI上而不是关注确实的内容感到恼火?就拿一个可变的对话框或属性页来说吧,你必须对它上面每一个控件去code,告诉当某些控件大小发生改变时,他们应该如何去改变。现在我知道我不是第一个对可变对话框(ResizableDialog)给出解决策的人,但是本文是我一个方法。

Description

基本上来说,所有你想要设计的对话框可以通过资源编辑器(不要忘记对话框属性设置大小可变)来实现,       然后你可以通过定义一个简单的宏来实现当对话框大小改变时去定义控件的动作。

Usage

注意:对于对话框和属性页来说,所有的处理都是一样的

1.#include EasySize.hstdafx.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.添加WM_SIZE的消息响应函数OnSize,添加 UPDATE_EASYSIZE

void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) 
{
    CDialog::OnSize(nType, cx, cy);
    UPDATE_EASYSIZE;
}

5.另外,如果你想设置对话框最小的size,添加WM_SIZEING的消息响应函数OnSizing,添加宏 EASYSIZE_MINSIZE macro,如下:

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

下面是Demo应用程序的"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 Macro

EASYSIZE macro是用来告诉控件当对话框大小改变后,自己该如何改变,形式如下:

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

control是控件ID;

left, top, right and bottom可以是对话框中的控件也可以是ES_BORDERES_KEEPSIZE

ES_BORDER说明:该控件到对话框边界距离不变;

ES_KEEPSIZE说明:该控件的宽或者高不变;

注意:left and right不能同时为ES_KEEPSIZEtop and bottom也不能同时为ES_KEEPSIZE


options可以是ES_HCENTER, ES_VCENTER and 0;

0指不做任何处理

ES_HCENTER指left和right之间水平居中

ES_VCENTER指top和bottom之间垂直居中




EasySize.h(EASY-SIZE Macros)下载地址:http://download.csdn.net/detail/chenjintaoxp/4573851

文章代码easysize_demo.zip下载地址:http://download.csdn.net/detail/chenjintaoxp/4573855


原文翻译:http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值