C Builder中保持控件的位置及大小
2008-02-23 05:39:03来源:互联网 阅读 ()
利用OnResize事件改变控件位置及大小
C Builder/Delphi中的Form控件有一个OnResize事件,Form的任何和大小变化有关的动作能够触发这个事件,包括Form的创建、最大化/最小化/还原、用鼠标拖动改变大小等。因此,在此事件中动态地改变各个控件的位置能够确保其在Form中的相对位置正确。因为CBuilder和Delphi的程式有很多一起之处,所以这里只列出CBuilder的代码。
下面的代码将确保控件在任何情况下都居中。
程式一:
void __fastcall TForm1::FofmResize(TObject*Sender)
{
int midLoc=Width/2; //取Form的中点
Label1->Left=midLoc-Label1->Width/2; //配置Label1的位置为Form居中
Button1->Left=midLoc-Button1->Width/2; //配置Button1的位置为Form居中
}
稍微修改这段代码,能够使控件保持在任何想要的位置。同样,也能够利用OnResize事件改变控件的大小。当Form中控件很多时,分别对每一个控件单独调整位置是件很麻烦的事,在TFrom类中有一个Controls数组维护任何From中的控件,利用他可方便地对任何控件进行操作。下面是其源代码:
程式二:
void __fastcall TForm1::FormResize(TObject*Sender)
{
int midLoc=Width/2;
TControl * ChildControl;
fof(int i=0; i<ControlCount; i )
{//遍历Controls数组,ControlCount是数组元素个数
ChildControl = Controls[i];
ChildCotrol->Left = midLoc-ChildControl->Width/2;
}
}
利用“容器”控制成组控件位置
上面的代码对维持任何控制到统一位置很方便,但不利于对成组控件进行操作。
在C Builder中提供了一些能安放其他控件的“容器”控件,如TPanel、TGroupBox等,能够将控件放在“容器”控件中:然后对“容器”控件进行操作,从而达到成组控制控件的目的。利用“容器”控件控制控件位置的结果,任何控件都自动居中,但是在GroupBox1控件中的子控件却没有居中,这是因为Controls数组只维护Form的直接子控件,对Form中控件的子控件则无能为力。因此,GroupBox1控件中的子控件仍然在初始位置,必须编写相应代码动态控制其位置及大小。这种技术很重要,特别是在动态改变“容器”控件大小时。其实,“容器”控件和From相同有Controls数组,只要对其进行和程式2类似的操作即可。代码见程式3
程式三
void __fastcall TForm1::FormResize(TObject*Sender)
{
int midLoc=Width/2;
TControl * ChildControl;
for(int i=0;i<ControlConnt; i )
{//遍历Controls数组,ControlCount是数组元素个数
ChildControl = Controls[i];
ChildControl->Left = midLoc-ChildControl->Width/2;
if (ChildControl ==GroupBox1)
{//若控件是GroupBox,对其子控件进行操作
int SubMidLoc=GroupBox1->Width/2;
for(int j=0;j<GroupBox1->ControlCount;j )
{//遍历GroupBox1的Controls数组。ControlCount是数组元素个数
ChildControl=GroupBox1->Controls[j];
ChildContro1->Left=SubMidLoc-ChildControl->Width/2;
}
}
}
}
在不同分辨率下维护窗体位置及大小
商业程式一般要在各种分辨率下运行,正确判断当前分辨率就显得很重要。Windows函数GetDeviceCaps能够返回任意设备描述表中设备大小。
GetDeviceCaps有两个参数,第一个是要查询的设备描述表句柄,第二个是要查询参数的类型,其中HORZRES,VERTRES分别代表屏幕水平和垂直分辨率。程式4是获得当前屏幕分辨率的代码。一般可将这段代码放在“工程文档”(如Project1.cpp)中,并将i、j定义为全局变量,然后能够利用前面介绍的技术控制各种屏幕元素的大小及位置。
程式四:
HDC hdc=GetDC(NULL); //获得屏幕设备描述表句柄
int i=GetDeviceCaps(hdc,HORZRES); //查询屏幕水平分辨率,并返回在变量i中
int j=GetDeviceCaps(hdc,VERTRES); //查询屏幕水平分辨率,并返回在变量j中
ReleaseDC(NULL,hdc); //释放屏幕设备描述表
用同样的方法,能够对不同大小纸张的打印进行控制,在这里不再赘述,有兴趣的朋友可查看GetDevice Caps帮助及打印帮助。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C Builder中实现控件数组的功能
下一篇: C Builder中
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash