用API函式在DELPHI中實現「非典型」窗體

2021-03-31 16:49:56 字數 3057 閱讀 4646

1.異形窗體

窗體只能是方的嗎?不是,還可以有其他形狀。這要用到兩個win32 api函式。首先用createroundrectrgn()函式在窗體內界定乙個橢圓形區域。這裡所指的區域(region)是乙個特殊的api物件,我們可以在區域內部進行填充和剪裁等操作,從而定義窗體的外部特徵。然後呼叫setwindowrgn()函式繪製,更進一步還可以再用***binergn()函式來合併多個區域,例如在delphi的單元檔案中加入以下**:

procedure tform1.formcreate(sender: tobject);

varfregion1:thandle;

fregion2:thandle;

begin

fregion1:=createroundrectrgn(20,20,200,200,300,300);//界定乙個橢圓區域

fregion2:=createrectrgn(170,170,400,400);//界定乙個矩形區域

***binergn(fregion1,fregion1,fregion2,rgn_or);//將兩個區域連線起來

setwindowrgn(handle,fregion1,true);//對連線後的區域進行繪製

end;

程式段中的createroundrectrgn()函式用來建立乙個圓角矩形區域,它的原型為:

hrgn createroundrectrgn(

int nleftrect, // 左上角的x座標

int ntoprect, // 左上角的y座標

int nrightrect, // 右下角的x座標

int nbottomrect, // 右下角的y座標

int nwidthellipse, //圓角所在橢圓的寬

int nheightellipse  // 圓角所在橢圓的高

);其他圖形如多邊形、橢圓形等都有對應的api函式,它們的原型如下:

hrgn createellipticrgn(int nleftrect,int ntoprect,int nrightrect,int nbottomrect)

hrgn createellipticrgnindirect( const rect *lprc)

hrgn createpolygonrgn(const point *l***,int cpoints, int fnpolyfillmode)

hrgn createpolypolygonrgn(const point *l***,const int *lppolycounts,int ncount,int fnpolyfillmode)

hrgn createrectrgn(int nleftrect,int ntoprect,int nrightrect,int nbottomrect)

hrgn createrectrgnindirect(const rect *lprc)

以上函式的引數很好理解,用來說明圖形內建矩形的座標或指向該矩形。重點來看一下另外兩個函式:

函式原型:setwindowrgn(

hwnd hwnd,         //當前窗體的控制代碼

hrgn hrgn,          //當前區域的控制代碼

bool bredraw,      //重繪標誌

)函式功能:該函式把已建立的區域的控制代碼作為引數傳遞給當前窗體的控制代碼,並在該區域範圍內繪製窗體;

函式原型:***binergn(

hrgn hrgndest,  // 連線目的區域的控制代碼

hrgn hrgnsrc1,  // 第乙個連線源區域的控制代碼

hrgn hrgnsrc2,  // 第二個連線源區域的控制代碼

int fn***binemode  // 連線模式

) 函式功能:該函式將兩個區域合併為乙個新的區域,其中連線模式可取以下值:

引數值          作用

rgn_and         由區域1與區域2的共有部分即交集建立新的區域

rgn_copy        建立區域1的副本作為新的區域

rgn_diff        連線屬於區域1但不屬於區域2的部分為新的區域

rgn_or          連線區域1和區域2的所有部分即並集

rgn_xor。     連線區域1和區域2的所有部分即並去掉共有部分

2.空心窗體

這種窗體的特點是好端端的乙個窗體,中間被挖了一部分。例如在delphi的單元檔案中加入以下**:

procedure tform1.formcreate(sender: tobject);

varfregion3:thandle;

begin

canvas.font.name:='華文行楷';//設定字型 

canvas.font.size:=100;//設定字型大小

beginpath(canvas.handle); //得到vanvas上繪製的輪廓

textout(form1.canvas.handle,0,20,'程式春秋',8);//將「程式春秋」四個字所佔區域摳掉

endpath(canvas.handle);

fregion3:=pathtoregion(canvas.handle);//將以上區域賦給窗體

setwindowrgn(handle,fregion3,true);//開始繪製

end;

這裡主要用到了三個api函式:

函式原型:bool beginpath(hdc hdc  //裝置環境的控制代碼)

函式功能:開始接收當前裝置環境的路徑軌跡;

函式原型:bool endpath(hdc hdc  //裝置環境的控制代碼) 

函式功能:停止接收並將已接收的路徑軌跡賦給當前裝置環境的控制代碼

函式原型  bool textout(

hdc hdc, // handle of device context

int nxstart, // 起始位置的x座標 

int nystart, // 起始位置的y座標

lpctstr lpstring, // 字串位址

int cbstring  //字串所包含字元數(注意乙個漢字佔兩個字元)

)函式功能:在指定位置繪製給定字串。

Delphi中呼叫API函式經驗點滴(三)

三 防止多次載入應用程式例項 某些應用程式需要禁止使用者載入多次例項。比如,控制面板中的應用程式,不管使用者開啟多少次,同一應用程式只有乙個例項,而且每一次試圖重複開啟都會自動啟用已經存在的例項。windows api 提供了函式findwindow,可以是應用程式在啟動時檢查自己是否已經存在。該函...

Delphi中TStringList的用法

tstrings是乙個抽象類,在實際開發中,是除了基本型別外,應用得最多的。常規的用法大家都知道,現在來討論它的一些高階的用法。先把要討論的幾個屬性列出來 1 commatext 2 delimiter delimitedtext 3 names values valuefromindex 一 co...

在Visual C 中運用API函式獲取系統資訊

api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c 中如何呼叫各種返回值的api...