C++ Builder中保持控件的位置及巨细
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辅佐及打印辅佐。