1. 程式人生 > WINDOWS開發 >使用者介面設計(3)- 窗體的主要方法

使用者介面設計(3)- 窗體的主要方法

窗體的顯示與隱藏:

Form2.Show;//顯示該窗體,是過程,程式碼會繼續往下執行
Form2.ShowModal{顯示該窗體,是函式,該窗體顯示時其他窗體不能進行任何操作。
                  不關閉該窗體,程式碼不會往下執行。該函式有一個整型返回值,
                  0代表mrNone,1代表mrOK,2代表mrCancel}
Hide;//隱藏當前顯示的窗體

窗體中子元件的焦點設定:

FocusControl(Button1);//指定窗體上某個元件是否獲得焦點,引數為所有視覺化元件
Edit1.SetFocus;//指定當前方法所在的元件獲得焦點
procedure
TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin //該方法可以按照指定的Order順序獲取窗體中元件的焦點 if key = #13 then Self.FindNextControl(Self.ActiveControl,True,False).SetFocus; end;

對窗體中元件的查詢:

Control屬性是一個元件陣列,用來儲存窗體中的所有子元件。

property Controls[Index: Integer]: TControl read GetControl;

Index引數為窗體中元件的索引值。

示例:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  {試想如果一個一個設定窗體中同類子元件的可用不可用,會很麻煩}
  for i=0 to Self.ControlCount-1 do //子元件數量
  begin
    if Self.Controls[i] is TEdit then
      TEdit(Self.Controls[i]).Enabled:= False;
  end;
end;

TControl、TComponent可參考面對物件程式設計分類下。

FindChildControl方法用於查詢窗體中的子元件,並返回子元件的TControl類。

function TWinControl.FindChildControl(const ControlName: string): TControl;

FindComponent方法查詢窗體中的子元件,並返回子元件的TComponent類

function TComponent.FindComponent(const AName: string): TComponent;

示例:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
const
  nameprefix = Edit;//用於建立的TEdit元件字首
begin
  button1.Enabled:= false;
  for i:= 0 to 10 do
  begin
    TEdit.Create(Self).Name:= nameprefix+ IntToStr(i);
    with TEdit(FindComponent(nameprefix+ IntToStr(i))) do
    begin
      if i mod 2 <> 0 then
      Left:= 30
      else
      Left:= 230;
      if (i mod 2 = 0) then
      Top:= (i-1)*20
      else
      top:= i*20;
      Parent:= Self;
    end;
  end;
end;

窗體座標的轉換:

ClientToScreen方法用於將客戶座標轉換成螢幕座標

function TControl.ClientToScreen(const Point: TPoint): TPoint;

引數Point是一個結構型別,該結構型別制定了座標X 和Y,該方法返回轉換後的螢幕座標值。

ScreenToClient方法用於將螢幕座標轉換成客戶座標

function TControl.ScreenToClient(const Point: TPoint): TPoint;

引數Point是一個結構型別,該結構型別制定了座標X 和Y,該方法返回轉換後的客戶座標值。

ClientToParent方法用於將客戶座標轉換為父類的座標

function TControl.ClientToParent(const Point: TPoint; AParent: TWinControl): TPoint;

引數AParent是要轉換座標的父類元件,預設值為空,此時Aparent為當前元件的直接父類。

技術分享圖片

1024x768的螢幕分辨度,假設我們的遊戲視窗Clent大小為800x600

X方向為0到1023個畫素點,y方向為0到767個畫素點

螢幕的高 Screen,height=1024

螢幕的高 Screen,width=768

定義rect:TRect;

用以下API函式得到視窗的對角位置

GetWindowRect (h,rect); 視窗控制代碼為h,

用以下API函式得到視窗Clent的對角位置

GetClientRect(h,

這裡的位置是相對全屏圖的原點(0,0)。

為了縮小找圖的範圍,提高速度,我們找圖一般是先得到遊戲視窗控制代碼,再把遊戲視窗Clent區抓成bmp,然後在bmp裡找,這樣找到的位置p(x,y),是相對Clent區原點(0,0),還要換算成螢幕的位置。換算可以用API函式ClientToScreen(h,p);

舉例

p.x:=0;

p.y:=0;

ClientToScreen(h,p); // (p.x,p.y)就是Clent區原點在螢幕上的位置

知道了圖片所在的螢幕位置,就可以用mouseMoveTo和moseLeftClick等來模擬動作了。