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

來源:互聯網
上載者:User

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協助及列印協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.