手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C Builder中保持控件的位置及大小

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
C Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C /Pascal研发工具,利用他可极大地加快应用程式的研发速度。但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了。随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得很混乱。本文将介绍一些正确定位控件及Form的方法。
利用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帮助及打印帮助。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS