简单而强大的可调整大小的对话框

示例对话框 原来的对话框 后对话框大小的右下角 后对话框大小的工具 介绍 这类的大小可调整的对话框可以自动调整控件的位置 和/或大小对话框的大小。重新定位和调整方向敏感 (左、右、上和底部可以分别处理不同) 行为六个方法之一:没有,调整,回购,相对的,变焦,DELTA_ZOOM(见 下面的更多信息)。 背景 这个类是源自于无闪烁 调整对话框(谢谢安迪·布朗)。安迪·布朗已经解决了闪烁 问题(这真的困惑我一次)和他的类支持在没有调整, 调整、回购、相对模式。 但是我需要更多的可控的重新定位和/或调整处理程序,我想 别人也需要它。所以我增强的安迪·布朗的类和写这类 这增加了以下功能: 重新定位和调整方向敏感。如安迪·布朗的类治疗 对话框的大小左右一样大小(x)。这个类可以 用不同的方式来对待它们。 变焦控制对话框放大。 能够调整多个控件的位置和大小分别 在同一X / y形水准仪。如这类可以调整两个控件 都处于同一水平线对话框的changed-width 50%,在另一个吗 话说,如果对话框的宽度增加了10个像素,这类增加 控件的宽度5像素。 使用的代码 ResizeDlg.cpp和ResizeDlg.h添加到您的项目或makefile; 添加“#包括ResizeDlg。h”stdafx.h文件或您的对话框 头文件; 让你dialog-derived类继承CResizeDlg代替 的CDialog取代“CDialog”的所有实例 与“CResizeDlg”在你的对话框头文件和实现文件。 添加一个处理程序WM_INITDIALOG如果你在你的对话框类 没有这样做,如下所述。 WM_INITDIALOG (OnInitDialog) 在你OnInitDialog处理程序应该调用基类的 OnInitDialog AddControl呼吁这些控件 自动重新定位和/或大小当对话框的大小。 这是一个例子。隐藏,复制Code

//
// the minimal work you have to do in your OnInitDialog handler.
//
BOOL CMyDialog::OnInitDialog()
{
 CResizeDlg::OnInitDialog();

 AddControl(IDOK, CST_REPOS, CST_REPOS, CST_NONE, CST_NONE, 1);
 AddControl(IDCANCEL, CST_REPOS, CST_REPOS, CST_NONE, CST_NONE, 1);
 
 return TRUE;
}

如何控制定位和/或尺寸吗 这个类允许控制动态地重新定位和/或大小 方向(左、上、右、下)是以下方式之一。 CST_NONEdo不是这个方向重新定位和规模;CST_RESIZEsize控制对话框的大小改变 方向。隐藏,/ /复制代码 / /在x方向,△ / /对话框的changed-width。 // ctrlRect。+ =△; CST_REPOSreposition控制对话框的改变大小 方向。隐藏,/ /复制代码 / /在x方向,△对话框 / / changed-width。 // ctrlRect。左+ =△; ctrlRect。+ =△; CST_RELATIVEreposition控件的用户定义的比例(可以做控制 总是在同一比例位置对话框)。隐藏,/ /复制代码 / /在x方向,m_xRatio在哪里 / /定义的比例 / /新ClientRect pnRect是对话框 // newCx = ctrlRect.Width (); ctrlRect。= (int) (m_xRatio * pnRect→宽度()——newCx / 2.0); ctrlRect。正确的= ctrlRect。左+ newCx; CST_ZOOMreposition和大小控制自动隐藏,/ /复制代码 / /在x方向,pnRect在哪里 / /对话框的新ClientRect。 / /原始ClientRect pR0是对话框 / /(不是以前的宽度)。 // ctrlRect。= (int) (1.0 * ctrlRect.left离开了 *(双)pnRect→宽度()/ pR0→宽度()); ctrlRect。= (int) (1.0 * ctrlRect.right *(双)pnRect→宽度()/ pR0→宽度()); CST_DELTA_ZOOMreposition和大小控制比例,比例都可以 分别设置。隐藏,/ /复制代码 / /在x方向,deltaX0在哪里 / /对话框的chenged-width / /与原来相比宽度(不是 / /之前的宽度,否则错误 / /将混乱的结果)。 / /用户定义X-reposition m_xRatio / /比例和 / / m_cxRatio是用户定义的X-size比例。 // newCx = ctrlRect.Width (); ctrlRect。= (int) (ctrlRect。左+ deltaX0 * m_xRatio + newCx + deltaX0 * m_cxRatio); ctrlRect。左+ = (int) (deltaX0 * m_xRatio); 使用AddControl 你应该叫AddControl设置对话框控件的行为方式 在OnInitDialog大小。它的原型如下:隐藏,复制Code

void AddControl( UINT nID, int xl, int xr, int yt, 
              int yb, int bFlickerFree = 0, 
              double xRatio = -1.0, double cxRatio = -1.0,
              double yRatio = -1.0, double cyRatio = -1.0 );

where nIDcontrol资源IDxlhow控制对话框调整离开时,重新定位和/或调整。 把它CST_xx之一。xrhow控件重新定位和/或调整时对话框调整正确。 把它CST_xx之一。ythow控件重新定位和/或调整时对话框大小。 把它CST_xx之一。ybhow控制对话框调整底部时重新定位和/或调整。 把它CST_xx之一。bFlickerFreewhether尽量避免闪烁时重新定位和/或调整 这个比例controlxRatiouser-defined方向重新定位。有效的只有当 xl xr是CST_RELATIVE或者CST_DELTA_ZOOM。将其设置为0.0 ~ 1.0.cxRatiou由ser定义的x方向调整比例。仅当xl时有效 xr是CST_DELTA_ZOOM。将其设置为0.0~1.0。yratiouser定义的y方向复位比例。有效的只有当 yt或yb是CST_RELATIVE或CST_DELTA_ZOOM。将其设置为0.0~1.0。胞浆菌定义的y方向调整比例。仅当yt时有效 或者yb是CST_DELTA_ZOOM。将其设置为0.0~1.0。 典型的AddControl用法 保持编辑控件水平调整为对话框大小。隐藏,复制CodeAddControl(编辑id, CST_RESIZE, CST_RESIZE, CST_NONE CST_NONE 1); 保持右上角按钮在相同的右上角位置。隐藏,复制CodeAddControl(按钮id, CST_REPOS, CST_REPOS, CST_NONE CST_NONE 1); 保持一个按钮在固定距离的底部和水平中心。隐藏,复制CodeAddControl(按钮id, CST_RELATIVE, CST_RELATIVE, CST_REPOS, CST_REPOS, 1, 1.0); 在水平线上有两个编辑控件,请调整左编辑控件的大小 而右一个保持相同的大小时,对话框左大小,或左一个保持 相同的大小和右一个调整时,对话框大小正确。隐藏,复制CodeAddControl (left-edit-ID CST_RESIZE, CST_NONE, CST_NONE, CST_NONE, 1); AddControl (right-edit-ID CST_REPOS, CST_RESIZE, CST_NONE, 1); 两个编辑控件如示例4。使它们的大小与对话框的大小相同 changed-width。换句话说,如果对话框的宽度增加了10个像素,那么每个 将编辑控件的宽度分别增加5像素。隐藏,复制CodeAddControl(左编辑id, CST_DELTA_ZOOM, CST_DELTA_ZOOM, CST_NONE, CST_NONE, 1,0.0, 0.5); AddControl (right-edit-ID CST_DELTA_ZOOM CST_DELTA_ZOOM, 其中0.0,0.5表示 左编辑控件不会将其位置和大小调整为对话框的50% changed-width。0.5表示右编辑控件改变其 位置为50%,因为左控件要调整大小,所以它必须重新定位,并调整大小 随对话框宽度变化50%。 注意 大小-抓地力(,在对话框的右下角)的资源ID (IDC_DLGSIZEBOX)为 ResizeDlg.h中定义。如果有的话,应该将其设置为另一个未使用资源ID 用在别的地方。 不要在对话框中为组控件设置无闪烁(设置 调用AddControl时,bFlickerFree到0)。 历史 2004年9月26日-首次公开发行。 本文转载于:http://www.diyabc.com/frontweb/news3626.html

原文地址:https://www.cnblogs.com/Dincat/p/13461229.html