用API函數在DELPHI中實現「非典型」窗體
現在的一些共享軟體特別是一些多媒體播放器軟體為了吸引用戶,很注重程式介面的設計。實際上,我們使用API函數也可以實現那些好看又另類的效果。
1.異形窗體
窗體只能是方的嗎?不是,還可以有其他形狀。這要用到兩個Win32 API函數。首先用CreateRoundRectRgn()函數在窗體內界定一個橢圓形區域。這裡所指的區域(region)是一個特殊的API對象,我們可以在區域內部進行填充和剪裁等操作,從而定義窗體的外部特徵。然後呼叫SetWindowRgn()函數繪製,更進一步還可以再用CombineRgn()函數來合併多個區域,例如在Delphi的單元檔案中加入以下程式碼:
PRocedure TForm1.FormCreate(Sender: TObject);
var
FRegion1:THandle;
FRegion2:THandle;
begin
FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//界定一個橢圓區域
FRegion2:=CreateRectRgn(170,170,400,400);//界定一個矩形區域
CombineRgn(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 *lPPT,int cPoints, int fnPolyFillMode)
HRGN CreatepolypolygonRgn(CONST POINT *lppt,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, //重繪標誌
)
函數功能:此函數將已建立的區域的句柄作為參數傳遞給目前窗體的句柄,並在該區域範圍內繪製窗體;
函數原型:CombineRgn(
HRGN hrgnDest, // 連接目的區域的句柄
HRGN hrgnSrc1, // 第一個連接來源區域的句柄
HRGN hrgnSrc2, // 第二個連接來源區域的句柄
int fnCombineMode // 連線模式
)
函數功能:此函數將兩個區域合併為一個新的區域,其中連接模式可取以下值:
參數值作用
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);
var
FRegion3: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 //字串所包含字元數(注意一個漢字佔兩個字元)
)
函數功能:在指定位置繪製給定字串。
小結:學會熟練使用API進行編程,是一項很重要的技能,有時可以達到意想不到的效果。以上幾種技巧旨在拋磚引玉,希望大家充分運用各種技巧,發揮自己想像,設計出更炫的窗體,美化自己的程序