精华内容
下载资源
问答
  • EasySize.zip

    2020-09-07 19:35:24
    MFC自适应的easysize的头文件,需要的小伙伴自行下载,不需要积分,也可以自行去下载,好多大佬那里都留有链接,不喜勿喷,亲测可用
  • easysize demo

    2018-10-12 16:14:07
    Windows VC 代码,安排窗口上控件的排列,让开发变得简单
  • easysize.h下载,因为原网站下载有些不方便,就放在这里,随取随用,解压后得到的就是。h文件。
  • easySize.rar

    2019-09-09 11:48:50
    一个短小精悍的宏,利用该宏,可以很轻易的实现MFC的Dialog的缩放。
  • MFC easysize

    2015-04-23 19:00:03
    运用该文件,可以是MFC界面部件自适应变化,满足窗体拉伸等需求变化
  • 选择exsysize.h文件加入到项目,这一步不是必须的,只是觉得加入项目中比较好看。... 在类内声明: 在DemoEasysizeDlg.h(窗体头文件)中加入DECLARE_EASYSIZE // CDemoEasysizeDlg 对话框 class CDemoEasy...

    选择exsysize.h文件加入到项目,这一步不是必须的,只是觉得加入项目中比较好看。

     

    一、 使用步骤

    1. 包含头文件:在stdafx.h包含头文件或者DemoEasysizeDlg.h(对应窗口头文件下)
    2. 在类内声明: 在DemoEasysizeDlg.h(窗体头文件)中加入DECLARE_EASYSIZE
    // CDemoEasysizeDlg 对话框
    class CDemoEasysizeDlg : public CDialogEx
    {
        DECLARE_EASYSIZE // ------加在这里
    // 构造
    public:
        CDemoEasysizeDlg(CWnd* pParent = NULL); // 标准构造函数
    
    // 对话框数据
        enum { IDD = IDD_DEMOEASYSIZE_DIALOG };
    
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    
    // 实现
    protected:
        HICON m_hIcon;
    
        // 生成的消息映射函数
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        DECLARE_MESSAGE_MAP()
    };
    
    

          3.初始化easysize:在OnInitDialog函数中加入

    BOOL CDemoEasysizeDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    
        ...
            // 省略
            ...
    
        // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);         // 设置大图标
        SetIcon(m_hIcon, FALSE);        // 设置小图标
    
        // TODO:  在此添加额外的初始化代码
        INIT_EASYSIZE; // easysize代码
    
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    

    4.更新 Easysize: 增加OnSize函数,添加宏UPDATE_EASYSIZE

    添加窗口ON_WM_SIZE,ON_WM_SIZING消息处理

    void CDemoEasysizeDlg::OnSize(UINT nType, int cx, int cy)
    {
        CDialogEx::OnSize(nType, cx, cy);
    
        // TODO:  在此处添加消息处理程序代码
        UPDATE_EASYSIZE; // easysize代码
    }
    
    
    void CDemoEasysizeDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
        CDialogEx::OnSizing(fwSide, pRect);
    
        // TODO:  在此处添加消息处理程序代码
        EASYSIZE_MINSIZE(280, 250, fwSide, pRect); // easysize代码
    }
    

    5. 添加EASYSIZE 的宏映射
    在DlgCpp, 设置值在后面描述

     

    END_MESSAGE_MAP()
    // 以上是原有代码
    BEGIN_EASYSIZE_MAP(CDemoEasysizeDlg)
        EASYSIZE(IDOK, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
        EASYSIZE(IDCANCEL, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
        EASYSIZE(IDC_STATIC_LEFT, ES_BORDER, ES_BORDER, ES_KEEPSIZE, ES_BORDER, 0)
        EASYSIZE(IDC_STATIC_CENTOR, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, 0)
        EASYSIZE(IDC_STATIC_RIGHT, ES_KEEPSIZE, ES_BORDER, ES_BORDER, ES_BORDER, 0)
    END_EASYSIZE_MAP
    // 以下是原有代码
    

     

    二、 设置说明

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

    (1).control:需要调整大小的控件的ID;

    (2).left,top,right,bottom:为控件左上角和右下角的坐标(亦可以看作控件的四条边),取值可以为:

    ES_BORDER: 控件与对话框边界的距离;

    ES_KEEPSIZE:控件水平/垂直方向上尺寸保持不变;

    控件ID值: 当前控件与指定控件之间的距离;

    (3).Options:可以为ES_HCENTER, ES_VCENTER的结合,options可置0。

    ES_HCENTER表示缩放后控件在指定位置内水平居中;

    ES_VCENTER表示缩放后控件在指定位置内垂直居中;

    三、 注意点

    1.在MFC中使用easysize按步骤配置完成后,EASYSIZE所作用的ID如果出现运行后异常占据窗体的情况,

       检查是否在OnInitDialog()函数中使用菜单,若使用了菜单,将菜单的相关函数内容注释或者移动到INIT_EASYSIZE之后

    2.  EASYSIZE() 水平方向或者垂直方向使用了多个KEEPSIZE,会导致对应的控件异常显示

    Easysize.h源码如下:

    /*===================================================*\
    |                                                     |
    |  EASY-SIZE Macros                                   |
    |                                                     |
    |  Copyright (c) 2001 - Marc Richarme                 |
    |      devix@devix.cjb.net                            |
    |      http://devix.cjb.net                           |
    |                                                     |
    |  License:                                           |
    |                                                     |
    |  You may use this code in any commersial or non-    |
    |  commersial application, and you may redistribute   |
    |  this file (and even modify it if you wish) as      |
    |  long as you keep this notice untouched in any      |
    |  version you redistribute.                          |
    |                                                     |
    |  Usage:                                             |
    |                                                     |
    |  - Insert 'DECLARE_EASYSIZE' somewhere in your      |
    |    class declaration                                |
    |  - Insert an easysize map in the beginning of your  |
    |    class implementation (see documentation) and     |
    |    outside of any function.                         |
    |  - Insert 'INIT_EASYSIZE;' in your                  |
    |    OnInitDialog handler.                            |
    |  - Insert 'UPDATE_EASYSIZE' in your OnSize handler  |
    |  - Optional: Insert 'EASYSIZE_MINSIZE(mx,my);' in   |
    |    your OnSizing handler if you want to specify     |
    |    a minimum size for your dialog                   |
    |                                                     |
    |        Check http://devix.cjb.net for the           |
    |              docs and new versions                  |
    |                                                     |
    \*===================================================*/
    
    
    #ifndef __EASYSIZE_H_
    #define __EASYSIZE_H_
    #define ES_BORDER 0xffffffff
    #define ES_KEEPSIZE 0xfffffffe
    #define ES_HCENTER 0x00000001
    #define ES_VCENTER 0x00000002
    #define DECLARE_EASYSIZE \
    void __ES__RepositionControls(BOOL bInit);\
    void __ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright);
    #define INIT_EASYSIZE __ES__RepositionControls(TRUE); __ES__RepositionControls(FALSE)
    #define UPDATE_EASYSIZE if(GetWindow(GW_CHILD)!=NULL) __ES__RepositionControls(FALSE)
    #define EASYSIZE_MINSIZE(mx,my,s,r) if(r->right-r->left < mx) { if((s == WMSZ_BOTTOMLEFT)||(s == WMSZ_LEFT)||(s == WMSZ_TOPLEFT)) r->left = r->right-mx; else r->right = r->left+mx; } if(r->bottom-r->top < my) { if((s == WMSZ_TOP)||(s == WMSZ_TOPLEFT)||(s == WMSZ_TOPRIGHT)) r->top = r->bottom-my; else r->bottom = r->top+my; }
    #define BEGIN_EASYSIZE_MAP(class) \
    void class::__ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright) {\
    if(br==ES_BORDER) bottomright = clientbottomright-es_br;\
    else if(br==ES_KEEPSIZE) bottomright = topleft+es_br;\
    else { CRect rect2;\
    pThis->GetDlgItem(br)->GetWindowRect(rect2); pThis->ScreenToClient(rect2);\
    bottomright = (bBottom?rect2.top:rect2.left) - es_br;}}\
    void class::__ES__RepositionControls(BOOL bInit) { CRect rect,rect2,client; GetClientRect(client);
    #define END_EASYSIZE_MAP Invalidate(); UpdateWindow(); }
    #define EASYSIZE(id,l,t,r,b,o) \
    static int id##_es_l, id##_es_t, id##_es_r, id##_es_b;\
    if(bInit) {\
    GetDlgItem(id)->GetWindowRect(rect); ScreenToClient(rect);\
    if(o & ES_HCENTER) id##_es_l = rect.Width()/2; else {\
    if(l==ES_BORDER) id##_es_l = rect.left; else if(l==ES_KEEPSIZE) id##_es_l = rect.Width(); else {\
    	GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2);\
    	id##_es_l = rect.left-rect2.right;}}\
    if(o & ES_VCENTER) id##_es_t = rect.Height()/2; else {\
    if(t==ES_BORDER) id##_es_t = rect.top; else if(t==ES_KEEPSIZE) id##_es_t = rect.Height(); else {\
    	GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2);\
    	id##_es_t = rect.top-rect2.bottom;}}\
    if(o & ES_HCENTER) id##_es_r = rect.Width(); else { if(r==ES_BORDER) id##_es_r = client.right-rect.right; else if(r==ES_KEEPSIZE) id##_es_r = rect.Width(); else {\
    	GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2);\
    	id##_es_r = rect2.left-rect.right;}}\
    if(o & ES_VCENTER) id##_es_b = rect.Height(); else  { if(b==ES_BORDER) id##_es_b = client.bottom-rect.bottom; else if(b==ES_KEEPSIZE) id##_es_b = rect.Height(); else {\
    	GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2);\
    	id##_es_b = rect2.top-rect.bottom;}}\
    } else {\
    int left,top,right,bottom; BOOL bR = FALSE,bB = FALSE;\
    if(o & ES_HCENTER) { int _a,_b;\
    if(l==ES_BORDER) _a = client.left; else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.right; }\
    if(r==ES_BORDER) _b = client.right; else { GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.left; }\
    left = _a+((_b-_a)/2-id##_es_l); right = left + id##_es_r;} else {\
    if(l==ES_BORDER) left = id##_es_l;\
    else if(l==ES_KEEPSIZE) { __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right); left = right-id##_es_l;\
    } else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); left = rect2.right + id##_es_l; }\
    if(l != ES_KEEPSIZE) __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right);}\
    if(o & ES_VCENTER) { int _a,_b;\
    if(t==ES_BORDER) _a = client.top; else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.bottom; }\
    if(b==ES_BORDER) _b = client.bottom; else { GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.top; }\
    top = _a+((_b-_a)/2-id##_es_t); bottom = top + id##_es_b;} else {\
    if(t==ES_BORDER) top = id##_es_t;\
    else if(t==ES_KEEPSIZE) { __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom); top = bottom-id##_es_t;\
    } else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); top = rect2.bottom + id##_es_t; }\
    if(t != ES_KEEPSIZE) __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom);}\
    GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);\
    }
    #endif //__EASYSIZE_H_

     

    展开全文
  • easysize实现程序

    2015-07-27 16:53:23
    easysize,能够很方便的实现控件大小随界面变化而有各种自己设置的变化
  • EasySize实例

    2013-07-14 22:51:11
    一个基于MFC的对话框的大小可调整的程序源代码,仅供参考。
  • easysize实例

    2012-05-26 14:54:59
    easysize 窗口最大化最小化 背景图片与控件随之变化
  • EasySize

    2015-07-03 14:26:34
    三个属性: ES_BORDER: 表示边框(控件与某个边框(上下左右)位置保持不变) ES_KEEPSIZE: 表示控件的宽度和高度保持不变,left/right只能设置其中一个为ES_KEEPSIZE,...//EASYSIZE(controlID,left,top,right,bottom
    1. 三个属性:
      ES_BORDER: 表示边框(控件与某个边框(上下左右)位置保持不变)
      ES_KEEPSIZE: 表示控件的宽度和高度保持不变,left/right只能设置其中一个为ES_KEEPSIZE,同理,top/bottom亦然。
      ES_HCENTER,ES_VCENTER:垂直或水平居中

    //EASYSIZE(controlID,left,top,right,bottom,options)
    EASYSIZE(IDC_EDIT1,ES_BORDER,xx,xx,xx,xx) : 表示距离left左边框保持不变。
    EASYSIZE(IDC_EDIT1,xx,ES_BORDER,xx,xx,xx) : 表示距离top上边框保持不变。
    EASYSIZE(IDC_EDIT1,xx,xx,ES_BORDER,xx,xx) : 表示距离right右边框保持不变。
    EASYSIZE(IDC_EDIT1,xx,xx,xx,ES_BORDER,xx) : 表示距离bottom下边框保持不变。

    EASYSIZE(IDC_EDIT1,ES_KEEPSIZE,xx,xx,xx,xx) : 表示left方向(水平)大小不变。
    EASYSIZE(IDC_EDIT1,xx,xx,ES_KEEPSIZE,xx,xx) : 表示right方向(水平)大小不变。
    EASYSIZE(IDC_EDIT1,xx,ES_KEEPSIZE,xx,xx,xx) : 表示top方向(垂直)大小不变。
    EASYSIZE(IDC_EDIT1,xx,xx,xx,ES_KEEPSIZE,xx) : 表示bottom方向(垂直)大小不变。
    有两个ES_KEEPSIZE出现表示控件大小(水平和垂直)不变。

    option中ES_HCENTER, 表示水平居中, 注意, 是水平居中, 这是表示该控件会出现在left和right的正中间,
    ES_VCENTER 表示垂直居中。

    配置有先后,配置不当会报错。
    2.
    BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
    //EASYSIZE(control,left,top,right,bottom,options)
    EASYSIZE(IDC_EDIT1,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_EDIT2,ES_BORDER,ES_KEEPSIZE, ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_EDIT3,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
    EASYSIZE(IDC_EDIT4,IDC_EDIT2,IDC_EDIT3,ES_BORDER,ES_BORDER,0)
    END_EASYSIZE_MAP

    EASYSIZE(IDC_EDIT1,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0) :
    表示控件IDC_EDIT1距离边框上下左右距离都不变,这一以来水平和垂直方向尺寸自动拉伸;

    EASYSIZE(IDC_EDIT2,ES_BORDER,ES_KEEPSIZE, ES_BORDER,ES_BORDER,0):
    表示控件IDC_EDIT2距离边框上左右距离不变,垂直尺寸不变,水平拉伸;

    EASYSIZE(IDC_EDIT3,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0):
    表示控件IDC_EDIT2距离边框上右距离不变,控件大小不变;

    EASYSIZE(IDC_EDIT4,IDC_EDIT2,IDC_EDIT3,ES_BORDER,ES_BORDER,0) :
    表示控件IDC_EDIT4 left左边与IDC_EDIT2的边框保持距离不变,上与IDC_EDIT3边框保持距离不变。

    这里写图片描述
    与QQ聊天框类似的拉伸效果。

    展开全文
  • 编译通过的easysize.h头文件

    热门讨论 2012-11-23 21:40:59
    可以用的easysize.h头文件,定义好的宏,实现界面 各个控件的按比例布局
  • easysize

    2013-07-18 09:38:32
    EASYSIZE 假设创建的对话框的类名是CMyDlg,具体过程如下:   步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "easysize.h"; 步骤二:在CMyDlg类的h文件中,加入...

    EASYSIZE

    假设创建的对话框的类名是CMyDlg,具体过程如下:

     

    步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "easysize.h";

    步骤二:在CMyDlg类的h文件中,加入DECLARE_EASYSIZE,注意结尾处不要加“;”。

     

    class CMyDlg : public CDialog

    {

           DECLARE_EASYSIZE

    // Construction

    }

    步骤三:在CMyDlg类的OnInitDialog()函数的结尾处加入INIT_EASYSIZE, 注意此处结尾处要加“;”。

    BOOL CMyDlg::OnInitDialog()

    {     …

    // TODO: Add extra initialization here

           INIT_EASYSIZE;

           return TRUE;  // return TRUE  unless you set the focus to a control

    }

     

    步骤四:增加WM_SIZE消息响应函数OnSize(),在函数中加入UPDATE_EASYSIZE,注意此处结尾处要加“;”。

    void CMyDlg::OnSize(UINT nType, int cx, int cy)

    {

           CDialog::OnSize(nType, cx, cy);

           // TODO: Add your message handler code here

           UPDATE_EASYSIZE;

    }

     

    步骤五:在CMyDlg的cpp文件中添加EASYSIZE 的宏映射

     

    BEGIN_EASYSIZE_MAP(CMyDlg)

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

    END_EASYSIZE_MAP

     

     

    注意:如果没有添加EASYSIZE 的宏映射就开始编译的话,会出现链接错误!

     

    这里需要解释的是宏EASYSIZE()的用法,其原型如下:

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

    该宏表示对ID值为control的控件实施缩放效果,缩放后的上下左右位置由control,left,top,right,bottom来确定,大小由option确定。

    其中:control为对话框中的控件ID值,left,top,right,bottom四个参数为控件位置的坐标,其值可以选择ES_BOARD,ES_KEEPSIZE, 控件ID值三者之一。Options可以为ES_HCENTER, ES_VCENTER的结合,options可置0。

     

    ES_BOARD表示控件与对话框边界(以下简称边界)的距离;

    ES_KEEPSIZE表示控件水平/垂直方向上尺寸保持不变

    控件ID值表示当前控件与指定控件之间的距离;

    ES_HCENTER表示缩放后控件在指定位置内水平居中;

    ES_VCENTER表示缩放后控件在指定位置内垂直居中;

     

    例如:

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)

    表示缩放后,值为IDOK的控件,距离边界上下左右位置保持不变,水平和垂直方向尺寸拉伸;

     

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER)

    表示缩放后,值为IDOK的控件,距离边界上下位置保持不变,垂直方向尺寸拉伸,水平居中;

     

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER| ES_HCENTER)

    表示缩放后,值为IDOK的控件,在对话框内垂直居中,水平居中;

     

     

    EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)

    表示缩放后,值为IDOK的控件,距离边界左、下方位置保持不变,同时保持控件尺寸;

     

    EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE, ES_BORDER,ES_BORDER,0)

    表示缩放后,值为IDOK的控件,距离边界左、右、下方位置保持不变,水平方向尺寸拉伸,垂直方向尺寸不变

     

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,IDCANCEL,ES_BORDER,0)

    表示缩放后,值为IDOK的控件,距离边界上下左位置保持不变,距离ID值为IDCANCEL的右方位置距离保持不变,水平和垂直方向尺寸拉伸;(当使用指定控件作为定位参数时候,确保指定控件的EASYSIZE在该宏前面)

    /*===================================================*\
    |                                                     |
    | EASY-SIZE Macros                                   |
    |                                                     |
    | Copyright (c) 2001 - Marc Richarme                 |
    |                                  |
    |      http://devix.cjb.net                           |
    |                                                     |
    | License:                                           |
    |                                                     |
    | You may use this code in any commersial or non-    |
    | commersial application, and you may redistribute   |
    | this file (and even modify it if you wish) as      |
    | long as you keep this notice untouched in any      |
    | version you redistribute.                          |
    |                                                     |
    | Usage:                                             |
    |                                                     |
    | - Insert 'DECLARE_EASYSIZE' somewhere in your      |
    |    class declaration                                |
    | - Insert an easysize map in the beginning of your |
    |    class implementation (see documentation) and     |
    |    outside of any function.                         |
    | - Insert 'INIT_EASYSIZE;' in your                  |
    |    OnInitDialog handler.                            |
    | - Insert 'UPDATE_EASYSIZE' in your OnSize handler |
    | - Optional: Insert 'EASYSIZE_MINSIZE(mx,my);' in   |
    |    your OnSizing handler if you want to specify     |
    |    a minimum size for your dialog                   |
    |                                                     |
    |        Check http://devix.cjb.net for the           |
    |              docs and new versions                  |
    |                                                     |
    \*===================================================*/


    #ifndef __EASYSIZE_H_
    #define __EASYSIZE_H_
    #define ES_BORDER 0xffffffff
    #define ES_KEEPSIZE 0xfffffffe
    #define ES_HCENTER 0x00000001
    #define ES_VCENTER 0x00000002
    #define DECLARE_EASYSIZE \
    void __ES__RepositionControls(BOOL bInit);\
    void __ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright);
    #define INIT_EASYSIZE __ES__RepositionControls(TRUE); __ES__RepositionControls(FALSE)
    #define UPDATE_EASYSIZE if(GetWindow(GW_CHILD)!=NULL) __ES__RepositionControls(FALSE)
    #define EASYSIZE_MINSIZE(mx,my,s,r) if(r->right-r->left < mx) { if((s == WMSZ_BOTTOMLEFT)||(s == WMSZ_LEFT)||(s == WMSZ_TOPLEFT)) r->left = r->right-mx; else r->right = r->left+mx; } if(r->bottom-r->top < my) { if((s == WMSZ_TOP)||(s == WMSZ_TOPLEFT)||(s == WMSZ_TOPRIGHT)) r->top = r->bottom-my; else r->bottom = r->top+my; }
    #define BEGIN_EASYSIZE_MAP(class) \
    void class::__ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright) {\
    if(br==ES_BORDER) bottomright = clientbottomright-es_br;\
    else if(br==ES_KEEPSIZE) bottomright = topleft+es_br;\
    else { CRect rect2;\
    pThis->GetDlgItem(br)->GetWindowRect(rect2); pThis->ScreenToClient(rect2);\
    bottomright = (bBottom?rect2.top:rect2.left) - es_br;}}\
    void class::__ES__RepositionControls(BOOL bInit) { CRect rect,rect2,client; GetClientRect(client);
    #define END_EASYSIZE_MAP Invalidate(); UpdateWindow(); }
    #define EASYSIZE(id,l,t,r,b,o) \
    static int id##_es_l, id##_es_t, id##_es_r, id##_es_b;\
    if(bInit) {\
    GetDlgItem(id)->GetWindowRect(rect); ScreenToClient(rect);\
    if(o & ES_HCENTER) id##_es_l = rect.Width()/2; else {\
    if(l==ES_BORDER) id##_es_l = rect.left; else if(l==ES_KEEPSIZE) id##_es_l = rect.Width(); else {\
    GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_l = rect.left-rect2.right;}}\
    if(o & ES_VCENTER) id##_es_t = rect.Height()/2; else {\
    if(t==ES_BORDER) id##_es_t = rect.top; else if(t==ES_KEEPSIZE) id##_es_t = rect.Height(); else {\
    GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_t = rect.top-rect2.bottom;}}\
    if(o & ES_HCENTER) id##_es_r = rect.Width(); else { if(r==ES_BORDER) id##_es_r = client.right-rect.right; else if(r==ES_KEEPSIZE) id##_es_r = rect.Width(); else {\
    GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_r = rect2.left-rect.right;}}\
    if(o & ES_VCENTER) id##_es_b = rect.Height(); else { if(b==ES_BORDER) id##_es_b = client.bottom-rect.bottom; else if(b==ES_KEEPSIZE) id##_es_b = rect.Height(); else {\
    GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_b = rect2.top-rect.bottom;}}\
    } else {\
    int left,top,right,bottom; BOOL bR = FALSE,bB = FALSE;\
    if(o & ES_HCENTER) { int _a,_b;\
    if(l==ES_BORDER) _a = client.left; else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.right; }\
    if(r==ES_BORDER) _b = client.right; else { GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.left; }\
    left = _a+((_b-_a)/2-id##_es_l); right = left + id##_es_r;} else {\
    if(l==ES_BORDER) left = id##_es_l;\
    else if(l==ES_KEEPSIZE) { __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right); left = right-id##_es_l;\
    } else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); left = rect2.right + id##_es_l; }\
    if(l != ES_KEEPSIZE) __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right);}\
    if(o & ES_VCENTER) { int _a,_b;\
    if(t==ES_BORDER) _a = client.top; else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.bottom; }\
    if(b==ES_BORDER) _b = client.bottom; else { GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.top; }\
    top = _a+((_b-_a)/2-id##_es_t); bottom = top + id##_es_b;} else {\
    if(t==ES_BORDER) top = id##_es_t;\
    else if(t==ES_KEEPSIZE) { __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom); top = bottom-id##_es_t;\
    } else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); top = rect2.bottom + id##_es_t; }\
    if(t != ES_KEEPSIZE) __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom);}\
    GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);\
    }
    #endif //__EASYSIZE_H_ 

     

    other example:
    展开全文
  • 简单的介绍了EasySize得使用方法,解决控件的布局问题,适合初学者
  • easysize MFC对话框大小自动调整
  • easysize 控件位置

    2013-03-30 15:41:11
    easysize 调整控件大小 mfc 对话框位置 里面有使用说明 很强大
  • easysize源码

    2010-11-10 15:56:37
    easysize源码 可实现对话框放大缩小时,对话框内的控件保持大小和相对位置不变
  • Halcon中XLD轮廓在MFC对话框中pictrue控件上显示,并且可以通过滚动鼠标滚轮,放大缩小,同时对话框中的所有控件使用EasySize实现了控件跟随对话框缩放的功能。软件还对曲线进行了特征分析。需要安装halcon才能使用
  • 一、使用方法 假设创建的对话框的类名是CMyDlg,具体过程如下: 步骤一:在CMyDlg对话框界面单击右键进入对话框的属性设置界面,将Border设置为Resizing;将Maximize box和Minimize box均...步骤二:把easysize...

    转载:https://blog.csdn.net/u011762993/article/details/40898871
    一、使用方法
    假设创建的对话框的类名是CMyDlg,具体过程如下:

    步骤一:在CMyDlg对话框界面单击右键进入对话框的属性设置界面,将Border设置为Resizing;将Maximize box和Minimize box均设置为True;

    步骤二:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include “easysize.h”;

    步骤三:在CMyDlg类的h文件中,加入DECLARE_EASYSIZE,注意结尾处不要加“;

    // CMyDlg 对话框
    class CMyDlg : public CDialog
    {
    DECLARE_EASYSIZE
    // 构造
    public:
    CMyDlg (CWnd* pParent = NULL);// 标准构造函数

    ……
    }

    步骤四:在CMyDlg类的OnInitDialog()函数的结尾处加入INIT_EASYSIZE, 注意此处结尾处要加“;

    // CMyDlg 消息处理程序
    BOOL CMyDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();
    // TODO: 在此添加额外的初始化代码

       INIT_EASYSIZE;
    

    return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
    }

    步骤五:选中对话框编辑界面,右键进入类向导,选中WM_SIZE消息,点击右边“添加处理程序”,增加WM_SIZE消息响应函数OnSize(),在函数中加入UPDATE_EASYSIZE,注意此处结尾处要加“,WM_SIZING处理程序同此方法。

    //最大化
    void CMyDlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialogEx::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    UPDATE_EASYSIZE;
    }

    //如果需要限制对话框有一个最小尺寸,在OnSizing消息的响应函数添加EASYSIZE_MINSIZE(600, 400, fwSide, pRect),其中600、400为最小的长高尺寸

    void CMyDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
    CDialogEx::OnSizing(fwSide, pRect);

    // TODO: 在此处添加消息处理程序代码
    EASYSIZE_MINSIZE(600, 400, fwSide, pRect);
    }

    步骤六:在CMyDlg的cpp文件中添加EASYSIZE 的宏映射

    BEGIN_EASYSIZE_MAP(CMyDlg)

    //EASYSIZE(Control_ID,left,top,right,bottom,options)

    EASYSIZE(IDC_COMBO_COMMON,ES_BORDER,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
    EASYSIZE(IDC_BUTTON_OPEN,IDC_COMBO_COMMON,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
    EASYSIZE(IDC_BUTTON_CLOSE,IDC_BUTTON_OPEN,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)
    EASYSIZE(IDC_EDIT_RECEVE,ES_BORDER,ES_KEEPSIZE,ES_BORDER,IDC_BUTTON_CLR_RXBUF,ES_HCENTER)
    EASYSIZE(IDC_EDIT_SEND,IDC_BUTTON_CLOSE,ES_BORDER,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_SETMAXSEND,ES_BORDER,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_SETMAXRECV,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_ALLSEND,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_ALLRECEVE,ES_BORDER,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
    EASYSIZE(IDC_BUTTON_SEND,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_AUTO_PICK,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    EASYSIZE(IDC_BUTTON_END_PICK,IDC_BUTTON_AUTO_PICK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    EASYSIZE(IDC_STATIC_SEND1,IDC_BUTTON_END_PICK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    EASYSIZE(IDC_STATIC_SEND_COUNT,IDC_STATIC_SEND1,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    EASYSIZE(IDC_STATIC_COUNT,IDC_STATIC_SEND_COUNT,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    EASYSIZE(IDC_STATIC_NUM,IDC_STATIC_COUNT,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    END_EASYSIZE_MAP
    注意:如果没有添加EASYSIZE 的宏映射就开始编译的话,会出现链接错误!

    二、EASYSIZE使用方法
    这里需要解释的是宏EASYSIZE()的用法,其原型如下:
    EASYSIZE(control,left,top,right,bottom,options)
    该宏表示对ID值为control的控件实施缩放效果,缩放后的上下左右位置由control,left,top,right,bottom来确定,大小由option确定。

    其中:control为对话框中的控件ID值,left,top,right,bottom四个参数为控件位置的坐标,其值可以选择ES_BOARD,ES_KEEPSIZE, 控件ID值三者之一。Options可以为ES_HCENTER, ES_VCENTER的结合,options可置0。

    ES_BOARD表示控件与对话框边界(以下简称边界)的距离;

    ES_KEEPSIZE表示控件水平/垂直方向上尺寸保持不变;

    控件ID值表示当前控件与指定控件之间的距离;

    ES_HCENTER表示缩放后控件在指定位置内水平居中;

    ES_VCENTER表示缩放后控件在指定位置内垂直居中;

    例如:

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)
    表示缩放后,值为IDOK的控件,距离边界上下左右位置保持不变,水平和垂直方向尺寸拉伸;

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER)
    表示缩放后,值为IDOK的控件,距离边界上下位置保持不变,垂直方向尺寸拉伸,水平居中;

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER| ES_HCENTER)
    表示缩放后,值为IDOK的控件,在对话框内垂直居中,水平居中;

    EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
    表示缩放后,值为IDOK的控件,距离边界左、下方位置保持不变,同时保持控件尺寸;

    EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE, ES_BORDER,ES_BORDER,0)
    表示缩放后,值为IDOK的控件,距离边界左、右、下方位置保持不变,水平方向尺寸拉伸,垂直方向尺寸不变;

    EASYSIZE(IDOK,ES_BORDER,ES_BORDER,IDCANCEL,ES_BORDER,0)
    表示缩放后,值为IDOK的控件,距离边界上下左位置保持不变,距离ID值为IDCANCEL的右方位置距离保持不变,水平和垂直方向尺寸拉伸;(当使用指定控件作为定位参数时候,确保指定控件的EASYSIZE在该宏前面)

    三、经验证过的EasySize.h源文件
    /***************以下是EasySize.h源文***************/

    /*====================================================

    EasySize.h |

    | |
    | EASY-SIZE Macros |
    | |
    | Copyright (c) 2001 - Marc Richarme |
    | devix@devix.cjb.net |
    | http://devix.cjb.net |
    | |
    | License: |
    | |
    | You may use this code in any commersial or non-
    |
    | commersial application, and you may redistribute |
    | this file (and even modify it if you wish) as |
    | long as you keep this notice untouched in any
    |
    | version you redistribute. |
    | |
    | Usage: |
    | |
    | - Insert ‘DECLARE_EASYSIZE’ somewhere in your |
    | class declaration |
    | - Insert an easysize map in the beginning of your |
    | class implementation (see documentation) and
    |
    | outside of any function. |
    | - Insert ‘INIT_EASYSIZE;’ in your |
    | OnInitDialog handler. |
    | - Insert ‘UPDATE_EASYSIZE’ in your OnSize handler |
    | - Optional: Insert ‘EASYSIZE_MINSIZE(mx,my);’ in |
    | your OnSizing handler if you want to specify |
    | a minimum size for your dialog |
    | |
    | Check http://devix.cjb.net for the
    |
    | docs and new versions
    |
    | |
    =====================================================*/

    ifndef _EASYSIZE_H

    define _EASYSIZE_H

    define ES_BORDER 0xffffffff

    define ES_KEEPSIZE 0xfffffffe

    define ES_HCENTER 0x00000001

    define ES_VCENTER 0x00000002

    define DECLARE_EASYSIZE \

    void __ES__RepositionControls(BOOL bInit);\
    void __ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright);

    define INIT_EASYSIZE __ES__RepositionControls(TRUE); __ES__RepositionControls(FALSE)

    define UPDATE_EASYSIZE if(GetWindow(GW_CHILD)!=NULL) __ES__RepositionControls(FALSE)

    define EASYSIZE_MINSIZE(mx,my,s,r) if(r->right-r->left < mx) { if((s == WMSZ_BOTTOMLEFT)||(s == WMSZ_LEFT)||(s == WMSZ_TOPLEFT)) r->left = r->right-mx; else r->right = r->left+mx; } if(r->bottom-r->top < my) { if((s == WMSZ_TOP)||(s == WMSZ_TOPLEFT)||(s == WMSZ_TOPRIGHT)) r->top = r->bottom-my; else r->bottom = r->top+my; }

    define BEGIN_EASYSIZE_MAP(class) \

    void class::__ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright) {\
    if(br==ES_BORDER) bottomright = clientbottomright-es_br;\
    else if(br==ES_KEEPSIZE) bottomright = topleft+es_br;\
    else { CRect rect2;\
    pThis->GetDlgItem(br)->GetWindowRect(rect2); pThis->ScreenToClient(rect2);\
    bottomright = (bBottom?rect2.top:rect2.left) - es_br;}}\
    void class::__ES__RepositionControls(BOOL bInit) { CRect rect,rect2,client; GetClientRect(client);

    define END_EASYSIZE_MAP Invalidate(); UpdateWindow(); }

    define EASYSIZE(id,l,t,r,b,o) \

    static int id##_es_l, id##_es_t, id##_es_r, id##_es_b;\
    if(bInit) {\
    GetDlgItem(id)->GetWindowRect(rect); ScreenToClient(rect);\
    if(o & ES_HCENTER) id##_es_l = rect.Width()/2; else {\
    if(l==ES_BORDER) id##_es_l = rect.left; else if(l==ES_KEEPSIZE) id##_es_l = rect.Width(); else {\
    GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_l = rect.left-rect2.right;}}\
    if(o & ES_VCENTER) id##_es_t = rect.Height()/2; else {\
    if(t==ES_BORDER) id##_es_t = rect.top; else if(t==ES_KEEPSIZE) id##_es_t = rect.Height(); else {\
    GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_t = rect.top-rect2.bottom;}}\
    if(o & ES_HCENTER) id##_es_r = rect.Width(); else { if(r==ES_BORDER) id##_es_r = client.right-rect.right; else if(r==ES_KEEPSIZE) id##_es_r = rect.Width(); else {\
    GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_r = rect2.left-rect.right;}}\
    if(o & ES_VCENTER) id##_es_b = rect.Height(); else { if(b==ES_BORDER) id##_es_b = client.bottom-rect.bottom; else if(b==ES_KEEPSIZE) id##_es_b = rect.Height(); else {\
    GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2);\
    id##_es_b = rect2.top-rect.bottom;}}\
    } else {\
    int left,top,right,bottom; BOOL bR = FALSE,bB = FALSE;\
    if(o & ES_HCENTER) { int _a,_b;\
    if(l==ES_BORDER) _a = client.left; else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.right; }\
    if(r==ES_BORDER) _b = client.right; else { GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.left; }\
    left = _a+((_b-_a)/2-id##_es_l); right = left + id##_es_r;} else {\
    if(l==ES_BORDER) left = id##_es_l;\
    else if(l==ES_KEEPSIZE) { __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right); left = right-id##_es_l;\
    } else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); left = rect2.right + id##_es_l; }\
    if(l != ES_KEEPSIZE) __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right);}\
    if(o & ES_VCENTER) { int _a,_b;\
    if(t==ES_BORDER) _a = client.top; else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.bottom; }\
    if(b==ES_BORDER) _b = client.bottom; else { GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.top; }\
    top = _a+((_b-_a)/2-id##_es_t); bottom = top + id##_es_b;} else {\
    if(t==ES_BORDER) top = id##_es_t;\
    else if(t==ES_KEEPSIZE) { __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom); top = bottom-id##_es_t;\
    } else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); top = rect2.bottom + id##_es_t; }\
    if(t != ES_KEEPSIZE) __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom);}\
    GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);\
    }

    endif //_EASYSIZE_H

    /*********************以上是EasySize.h源文*****************************/

    展开全文
  • easysize 用法

    2011-06-07 15:23:54
    可以借此宏来实现mfc中按键随着窗体大小一起同步变化尺寸。
  • EASYSIZE

    千次阅读 2011-08-22 23:01:52
    假设创建的对话框的类名是CMyDlg,具体过程如下: ...步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "easysize.h"; 步骤二:在CMyDlg类的h文件中,加入DECLARE_E
  • 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: void __thiscall CMFCApplication1Dlg::__ES__RepositionControls(int)" (?__ES__RepositionControls@CMFCApplication1Dlg@@QAEXH@Z),该符号在函数 "public...
  • EasySize的使用

    2018-03-13 20:35:53
    第一步:把EasySize.h拷贝到CMyDlg项目文件夹中。第二步:在stdafx.h或者对话框的头文件、实现文件中#include"EasySize.h"头文件第三步:在对话框类的申明中加入DECLARE_EASYSIZE第四步:在对话框类的...
  • easySize使用方法和代码实现MFC对话框与空间等比放大
  • Easysize 的使用

    2015-11-12 10:08:05
    Easysize 的使用步骤 原文出自http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time#    1、在stdafx.h中引用EasySize.h头文件(同时将EasySize.h放到你的程序目录中)   2、在类定义...
  • MFC控件自适应大小(EASYSIZE动态调整控件位置、大小) 转自 https://www.cplusplus.me/1178.html 近日在code project网站浏览时,看到一篇关于Dialog缩放的文章(http://www.codeproject.com/dialog/easysize.asp...
  • 最大化最小化控件代码附带使用方法,文件是:EasySize.h

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 265
精华内容 106
关键字:

easysize