您的位置:首页 > 其它

简单而强大的可调整大小对话框(Simple and more powerful resizable dialog)

2009-09-17 16:31 357 查看
简单而强大的可调整大小对话框(Simple and more powerful resizable dialog)

翻译;邵盛松 2009-09-17
原文地址http://www.codeproject.com/KB/dialog/RPResizeDlg.aspx

说明:
这可调整大小的对话框类可以随着对话框大小变化自动调整控件的位置和大小。

代码使用
1 将ResizeDlg.cpp和ResizeDlg.h添加到你的项目文件。
2将"#Include ResizeDlg.h" 添加到stdafx.h或者对话框的头文件;
3 使用CResizeDlg类代替原来对话框的继承类CDialog,在对话框的头文件和实现文件中使用"CResizeDlg"替换所有的

"CDialog"
4 按照下面的描述,处理WM_INITDIALOG
为了随着对话框大小变化自动调整控件的位置和大小在OnInitDialog函数中调用基类的OnInitDialog和调用

AddControl。例子如下:

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_NONE
不重新定位
CST_RESIZE
控件大小随窗口变化
//
// in x direction, where deltaX is
// dialog's changed-width.
//
ctrlRect.right += deltaX;
CST_REPOS
控件位置随窗口变化
//
// in x direction, where deltaX is dialog's
// changed-width.
//
ctrlRect.left += deltaX;
ctrlRect.right += deltaX;
CST_RELATIVE
自定义控件位置的比例
//
// in x direction, where m_xRatio is
// user-defined proportion
// pnRect is dialog's new ClientRect
//
newCx = ctrlRect.Width();
ctrlRect.left = (int)(m_xRatio *
pnRect->Width() - newCx / 2.0);
ctrlRect.right = ctrlRect.left + newCx;
CST_ZOOM
控件的大小和位置自动变化
//
// in x direction, where pnRect is
// dialog's new ClientRect.
// pR0 is dialog's original ClientRect
// (NOT previous width).
//
ctrlRect.left = (int)(1.0 * ctrlRect.left
* (double)pnRect->Width() / pR0->Width());
ctrlRect.right = (int)(1.0 * ctrlRect.right
* (double)pnRect->Width() / pR0->Width());
CST_DELTA_ZOOM
控件的位置和大小按比例变化,可以各自设置比例
//
// in x direction, where deltaX0 is
// the dialog's chenged-width
// compared with its original width(NOT
// previous width, otherwise error
// will mess the result).
// m_xRatio is user defined X-reposition
// proportion and
// m_cxRatio is user defined X-size proportion.
//
newCx = ctrlRect.Width();
ctrlRect.right = (int)(ctrlRect.left +
deltaX0 * m_xRatio + newCx + deltaX0 * m_cxRatio);
ctrlRect.left += (int)(deltaX0 * m_xRatio);
AddControl 用法

在OnInitDialog函数中调用AddControl来设置控件的行为。函数的原型如下:
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 );

参数说明
nID 控件的资源ID
xl 对话框左边发生变化时,控件的位置与大小需要调整,就设置CST_xx其中之一。

xr 对话框右边发生变化时,控件的位置与大小需要调整,就设置CST_xx其中之一。

yt 对话框顶部发生变化时,控件的位置与大小需要调整,就设置CST_xx其中之一。

yb 对话框底部发生变化时,控件的位置与大小需要调整,就设置CST_xx其中之一。

bFlickerFree 当控件的定位与大小调整时,是否避免闪烁

xRatio 只有xl或者xr设置为 CST_RELATIVE或CST_DELTA_ZOOM此参数才有效,自定义x方向上的位置比例,比例设置范

围为0.0~1.0。

cxRatio 只有xl或者xr设置为CST_DELTA_ZOOM此参数才有效,自定义x方向上的大小比例,比例设置范围为0.0~1.0.

yRatio 只有yt或者yb设置为 CST_RELATIVE或CST_DELTA_ZOOM此参数才有效,自定义x方向上的位置比例,比例设置范

围为0.0~1.0。

cyRatio 只有yt或者yb设置为CST_DELTA_ZOOM此参数才有效,自定义x方向上的大小比例,比例设置范围为0.0~1.0.

使用AddControl

1 编辑控件的水平大小随对话框变化。
AddControl(edit-ID, CST_RESIZE, CST_RESIZE,CST_NONE, CST_NONE, 1);

2 按钮的右上角坐标与对话框的右上角的坐标相同
AddControl(button-ID, CST_REPOS, CST_REPOS,CST_NONE, CST_NONE, 1);

3按钮与对话框的底部距离固定,并且处于水平的中心位置。
AddControl(button-ID, CST_RELATIVE, CST_RELATIVE,CST_REPOS, CST_REPOS, 1, 1.0);

4 两个编辑框控件在同一条水平线上,当对话框左边的大小发生变化时,左边的编辑框大小发生变化,右边的编辑框

控件大小不变,或者对话框右边的大小发生变化时,右边的编辑框大小发生变化,左边的编辑框控件大小不变。
AddControl(left-edit-ID, CST_RESIZE, CST_NONE, CST_NONE, CST_NONE, CST_NONE, 1);
AddControl(right-edit-ID, CST_REPOS,CST_RESIZE, CST_NONE, CST_NONE, 1);

5像例4中的两个编辑框控件,当对话框的宽度发生变化时,这两个控件宽度均分对话框的宽度。换句话说,如果对话

框的宽度增加了10像素,那么每一个编辑框控件的宽度将各自增加5像素。

AddControl(left-edit-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,CST_NONE, CST_NONE, 1, 0.5, 0.5);

0.0,0.5的意思是左边的编辑框控件位置没有变化,同时编辑框控件的改变宽度是对话框的改变宽度的50%.
0.5,0.5的意思是右边的编辑框控件位置是对话框位置的%50,因为左边的编辑框控件发生了变化,所以右边的编辑框

控件就要重新调整,同时编辑框控件的改变宽度是对话框的改变宽度的50%.

注意:
在ResizeDlg.h文件中定义的对话框资源ID(IDC_DLGSIZEBOX)不要与你项目中的资源ID重复
Do not set flicker-free for group-controls in dialog 在调用AddControl时将参数bFlickerFree 设置为0


译者注:暂时不清楚何时将将参数bFlickerFree 设置为0。

原文作者:Robert Python
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: