简单而强大的可调整大小对话框(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;
}
如何设置控件的位置和大小
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
翻译;邵盛松 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); |
在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
相关文章推荐
- window.onload and showModalDialog根据内容自动调整窗口大小
- 对话框大小变化自动调整控件大小ClxDialog及使用方法
- 14. 74. 2. 一个简单的对话框A Simple Modal Dialog
- Android自定义对话框(Dialog)位置,大小
- 调整android dialog对话框显示位置
- Android自定义对话框(Dialog)位置,大小
- 调整弹出对话框在ASP.NET应用程序的大小
- M控件随着FC对话框大小自动调整大小
- mfc对话框如何关闭自动调整大小功能
- dojo小例子(36)ResizableDialog widget可缩放对话框
- 如何调整对话框的字体大小
- 一个简单的自适应调整字体大小view
- Android自定义对话框(Dialog)位置,大小
- Android自定义对话框(Dialog)位置,大小
- 动态调整对话框窗口大小的窗口类的资源链接
- Android编程自定义对话框(Dialog)位置及大小的方法
- Simple and powerful command of Microsoft Windows
- 如何实现控件随对话框大小变化而自动调整大小和位置
- Android中简单仿iPhone的Dialog对话框
- js showModalDialog 弹出对话框的简单实例(子窗体)