国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:13:19
字體:
來源:轉載
供稿:網友

  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幫助及打印幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎囊县| 淮北市| 拉孜县| 古丈县| 岱山县| 集安市| 嵊泗县| 鹿泉市| 尉犁县| 大悟县| 城固县| 论坛| 曲周县| 芜湖市| 漯河市| 新安县| 义乌市| 当涂县| 日喀则市| 灌阳县| 保康县| 徐水县| 开鲁县| 绿春县| 教育| 元朗区| 岳西县| 阜新市| 乐清市| 淳安县| 宁安市| 扎赉特旗| 宜兴市| 永济市| 姚安县| 博爱县| 科尔| 科尔| 科尔| 乐业县| 德阳市|