Windows 中不規則窗體的程式設計實現

2021-06-20 05:20:25 字數 4010 閱讀 3806

windows 中不規則窗體的程式設計實現

一、序言

在絕大多數的windows

應用程式中,其窗體都是使用的正規正矩的矩形窗體

,例如我們常用的,

「記事本」,

「掃雷」,等等。矩形窗體,具有程式設計實現簡單,風格簡潔的優點,所以在普通文件應用程式和 簡單小遊戲中使用足矣。但在某些娛樂遊戲程式中使用就略顯呆板些了,這時若用不規則窗體替代原先 的矩形窗體,將會使這類程式更添情趣。典型的例子有

windows 

自代的media player,

新版本的

media player

media player

的古老矩形介面要生動有趣的多了。 要實現不規則窗體不是太難,知道了基本原理後,你也可以建立各種有趣的不規則窗體。

二、實現原理

所有的 windows 

窗體都位於乙個稱為

「region」

中,窗體的大小如果超出

「region」

的範圍,

windows 

會自動裁剪超出

"region"

範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟:第一 步就是建立不規則

"region".

第二步就是將窗體放到建立的

「region」

中。其中第二步很簡單就呼叫一條語句即可。在sdk

中呼叫api

函式setwindowrgn

,該函式原型如下:

int setwindowrgn( hwnd hwnd, hrgn hrgn, bool bredraw );

其中hwnd

為待設定的窗體控制代碼,

hrgn

為已經建立的

"region"

控制代碼,bredraw

代表是否要重繪窗體。在

mfc 

中使用視窗類

cwnd

的成員函式

int cwnd::setwindowrgn

(hrgn hrgn, bool bredraw );

該函式的引數意 義與

api中同名函式相同。

相對與第二步,建立不規則窗體的第一步要複雜許多,並且不規則窗體越複雜,建立其"region"

的過程也越複雜。接下去我們將由淺入深地介紹各種建立

」region」

的方法。

在mfc

中"region"

物件,由

crgn

類實現。

crgn

的幾乎每個成員函式都有同名的

sdk api

函式對應。

三、簡單「region」

的建立類crgn

建立乙個新的

"region"

的簡單方法有以下幾個成員函式:

1 bool crgn::createrectrgn( int x1, int y1, int x2, int y2 ); 建立矩形的

「region」。

2 bool crgn::createellipticrgn( int x1, int y1, int x2, int y2 ); 建立圓形或橢圓形

「region」。

3 bool crgn::createroundrectrgn( int x1, int y1, int x2, int y2, int x3, int y3 ); 建立圓角矩形

「region」。

4 bool crgn::createpolygonrgn( lppoint lppoints, int ncount, int nmode ); 建立多邊形

「region」。

這裡以建立橢圓窗體為例,介紹橢圓窗體建立的方法。在建立橢圓「region」

的createellipticrgn

函式中,

x1,y1

指橢圓所在矩形的左上角座標,

x2,y2

指該矩形的右下角座標。

下面的**加入到mfc

對話方塊程式的

oninitdialog

函式中,可將該對話方塊變成橢圓窗體:

bool ctestdlg::oninitdialog()

圖一 橢圓窗體效果圖

四、作圖路徑法建立」region」

使用該方法建立」region」

的過程如下:

第一步繪製所要建立的窗體形狀。

該步驟中使用到cdc

類中的一些成員函式如下:

bool cdc::beginpath( );

呼叫該函式後當前裝置環境(dc)

開始追蹤繪圖的過程。

int cdc::setbkmode( int nbkmode );

設定繪圖時的背景模式,此應用中nbkmode

必須取值為

transparent 

。即設定繪圖時背景不發生變化。

bool cdc::endpath( );

呼叫該函式後當前裝置環境(dc)

結束追蹤繪圖的過程。

開始繪圖前,先呼叫beginpath

,然後呼叫

setbkmode

。接下去就可呼叫

cdc的其他繪圖函式作圖,例如

arc,anglearc,lineto,moveto,roundrect,,textout

等等。繪圖完畢呼叫

endpath().

第二步將繪製的結果轉成」region」.

此步驟中使用sdk api函式

hrgn pathtoregion( hdc hdc );

hdc為作圖

dc的控制代碼, 

cdc類中的

m_hdc

成員變數可做此引數傳入。示例,將下面**加入某個按鈕單擊事件中,可以將當前窗體變為字串

」hello」

的形狀void ctestdlg::ontest() 

}cclientdc是

cdc的派生類,故此該類具有所有

cdc類的成員變數和成員函式。 

圖二 hello

形狀的窗體效果圖

五、根據影象建立」region」

此法建立不規則窗體比較複雜。首先準備一張含有目標窗體形狀的,設定透明色即將中部不屬於窗體形狀的部分,標記成同一種顏色,例如藍色rgb(0,0,255).

程式執行後先裝入。然後逐個掃瞄的每個畫素,如這個畫素不屬於透明色,則在相應位置建立乙個只含乙個畫素的

「region」

然後將這些小

」region 」

合併起來組成乙個任意形狀的

」region」.

這裡將使用到

crgn

的乙個成員函式 :

int crgn::combinergn( crgn* prgn1, crgn* prgn2, int ncombinemode );

其中prgn1,prgn2

為要合併的兩個

「region」

,ncombinemode

為合併的方式,此應用中取

rgn_or

,即兩」region」

全部合併去處重複部分。**實現如下:

void setupregion(

cdc *pdc, //窗體的

dc指標

cbitmap &cbitmap, //含有窗體形狀的點陣圖物件

colorref transcolor //透明色 )

while(ix getwindow(); pwnd->setwindowrgn(wndrgn,true); pwnd->setforegroundwindow(); }

上述**建立的不規則窗體中,在onerasebkgnd

事件中繪製該位圖,就可得到與該點陣圖形狀一模一樣的窗體。 

圖三 根據點陣圖和點陣圖中的透明色建立的窗體效果圖

六、小結

三種建立「region」

的方法,第一種最簡單,如果所需的窗體形狀是簡單的幾何圖形,這種方法最合適;第二種稍微複雜些,但是建立的窗體形狀更多些;第三種方法可以建立任何在中畫出的窗體形狀,但是實現的複雜度也最高。 

Windows 中不規則窗體的程式設計實現

一 序言 二 實現原理 所有的 windows 窗體都位於乙個稱為 region 中,窗體的大小如果超出 region 的範圍,windows 會自動裁剪超出 region 範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟 第一步就是建立不規則 region 第二步就是將窗體放到建立的...

windows不規則窗體的程式設計實現

一 序言 二 實現原理 所有的 windows 窗體都位於乙個稱為 region 中,窗體的大小如果超出 region 的範圍,windows 會自動裁剪超出 region 範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟 第一步就是建立不規則 region 第二步就是將窗體放到建立的...

C 建立不規則窗體

要求 1 使得窗體或按鈕的形狀跟一致。效果圖 參考文件 修改或新增部分,已經用 此處為新增部分 標註,缺少則不能達到效果 using system using system.collections.generic using system.componentmodel using system.da...