C++Builder中保持控件的位置及大小
C++ Builder/Delphi是Enterprise(原Borland)流行的visual C++/Pascal开发工具,可以大大加快应用程序的开发速度。但是,正因为是可视化编程工具,将控件拖放到表单中后,控件的位置是固定的。随着窗体大小或屏幕分辨率的变化,控件和窗体本身的位置经常变得非常混乱。本文将介绍一些正确定位控件和窗体的方法。
使用OnResize事件更改控件的位置和大小。
C++ Builder/Delphi中的窗体控件有一个OnResize事件,所有与窗体大小变化相关的动作都可以触发该事件,包括窗体的创建、最小化/缩小、用鼠标拖动改变大小等。因此,在此事件中动态更改每个控件的位置可以确保其在窗体中的相对位置是正确的。因为CBuilder和Delphi有很多共同点,所以这里只列出CBuilder的代码。
下面的代码将确保控件在所有情况下都居中。
程序1:
void _ _ fast call t form 1::fofm resize(to object * Sender)
{
int midLoc = Width/2;File://取表格的中点
label 1-> Left = midLoc-label 1-> Width/2;File://将Label1的位置设置为表单中心。
button 1-> Left = midLoc-button 1-> Width/2;File://将Button1的位置设置为表单的中心
}
通过稍微修改这段代码,您可以将控件保持在任何需要的位置。同样,您也可以使用OnResize事件来更改控件的大小。当表单中有很多控件时,单独调整每个控件的位置是非常麻烦的。TFrom类中有一个控件数组,用来维护From中的所有控件,可以用来方便地操作所有控件。下面是它的源代码:
程序2:
void _ _ fast call t form 1::form resize(to object * Sender)
{
int midLoc = Width/2;
TControl * ChildControl
fof(int I = 0;I {//遍历控件数组,ControlCount是数组元素的个数。
child control = Controls[I];
child control-> Left = midLoc-child control-> Width/2;
}
}
使用“容器”来控制成组控件的位置。
上面的代码对于维护所有控件的统一位置非常方便,但是不利于操作控件组。
C++Builder提供了一些可以容纳其他控件的“容器”控件,如TPanel、TGrouPBox等。您可以将控件放在“容器”控件中,然后操作“容器”控件,以便成组地控制控件。使用“容器”控件控制控件位置的结果是,所有控件都自动居中,但GroupBox1控件中的子控件不居中。这是因为控件数组只维护窗体的直接子控件,但对窗体中控件的子控件无能为力。因此,GroupBox1控件中的子控件仍然处于初始位置,必须编写相应的代码来动态控制它们的位置和大小。这项技术非常重要,尤其是在动态改变“容器”控件的大小时。实际上,“容器”控件有一个类似From的控件数组,只要它的操作类似于程序2。参见程序3。
程序3:
void _ _ fast call t form 1::form resize(to object * Sender)
{
int midLoc = Width/2;
TControl * ChildControl
for(int I = 0;I {//遍历控件数组,ControlCount是数组元素的个数。
child control = Controls[I];
child control-> Left = midLoc-child control-> Width/2;
if (ChildControl ==GroupBox1)
{//如果控件是GroupBox,则操作其子控件。
int sub midloc = group box 1-> Width/2;
for(int
j = 0;jControlCountj++)
{//遍历GroupBox1的控件数组。控件是数组元素的数量。
child control = group box 1-> Controls[j];
child control 1-> Left = sub midloc-child control-> Width/2;
}
}
}
}
在不同分辨率下保持窗体的位置和大小。
一般商业程序都要在各种分辨率下运行,所以正确判断当前分辨率非常重要。Windows GetDeviceCaps函数可以返回任何设备描述表中的设备大小。
GetDeviceCaps有两个参数,第一个是要查询的设备描述表的句柄,第二个是要查询的参数类型,其中HORZRES和VERTRES分别代表屏幕的水平和垂直分辨率。程序4是获取当前屏幕分辨率的代码。一般这段代码可以放在一个“项目文件”(比如Project1.cpp)中,I和J可以定义为全局变量。然后,可以通过使用上述技术来控制各种屏幕元素的大小和位置。
程序4:
HDC HDC = GetDC(NULL);File://获取屏幕设备描述表的句柄
int i=GetDeviceCaps(hdc,horz RES);File://查询屏幕的水平分辨率,在变量I中返回。
int j=GetDeviceCaps(hdc,VERTRES);File://查询屏幕的水平分辨率,在变量j中返回。
ReleaseDC(NULL,hdc);File://发布屏幕设备描述表
同理可以控制不同尺寸纸张的打印,这里就不赘述了。感兴趣的朋友可以查看大写帮助和打印帮助。
0条评论