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

2021-06-20 18:02:55 字數 4138 閱讀 7140

一、序言

二、實現原理

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

其中第二步很簡單就呼叫一條語句即可。在sdk中呼叫api函式setwindowrgn,該函式原型如下:

1.intsetwindowrgn(hwndhwnd,hrgnhrgn,boolbredraw );

其中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函式中,可將該對話方塊變成橢圓窗體:

圖一 橢圓窗體效果圖

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

使用該方法建立」region」的過程如下:

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

該步驟中使用到cdc類中的一些成員函式如下:

1.boolcdc::beginpath( );

呼叫該函式後當前裝置環境(dc)開始追蹤繪圖的過程。

1.intcdc::setbkmode(intnbkmode );

設定繪圖時的背景模式,此應用中nbkmode必須取值為transparent 。即設定繪圖時背景不發生變化。

1.boolcdc::endpath( );

呼叫該函式後當前裝置環境(dc)結束追蹤繪圖的過程。

開始繪圖前,先呼叫beginpath,然後呼叫setbkmode。接下去就可呼叫cdc的其他繪圖函式作圖,例如arc,anglearc,lineto,moveto,roundrect,,textout等等。繪圖完畢呼叫endpath().

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

此步驟中使用sdk api函式

1.hrgnpathtoregion(hdchdc );

hdc為作圖dc的控制代碼, cdc類中的m_hdc成員變數可做此引數傳入。示例,將下面**加入某個按鈕單擊事件中,可以將當前窗體變為字串」hello」的形狀

01.voidctestdlg::ontest()

02.

35.}

cclientdc是cdc的派生類,故此該類具有所有cdc類的成員變數和成員函式。

圖二 hello形狀的窗體效果圖

五、根據影象建立」region」

此法建立不規則窗體比較複雜。首先準備一張含有目標窗體形狀的,設定透明色即將中部不屬於窗體形狀的部分,標記成同一種顏色,例如藍色rgb(0,0,255).程式執行後先裝入。然後逐個掃瞄的每個畫素,如這個畫素不屬於透明色,則在相應位置建立乙個只含乙個畫素的「region」然後將這些小」region 」合併起來組成乙個任意形狀的」region」.這裡將使用到crgn的乙個成員函式 :

1.intcrgn::combinergn( crgn* prgn1, crgn* prgn2,intncombinemode );

其中prgn1,prgn2為要合併的兩個「region」,ncombinemode為合併的方式,此應用中取rgn_or,即兩」region」全部合併去處重複部分。**實現如下:

01.voidsetupregion(

02.cdc *pdc,//窗體的dc指標

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

04.colorreftranscolor//透明色

05.)

06.while(ix getwindow();

49.pwnd->setwindowrgn(wndrgn,true);

50.pwnd->setforegroundwindow();

51.}

上述**建立的不規則窗體中,在onerasebkgnd事件中繪製該位圖,就可得到與該點陣圖形狀一模一樣的窗體。

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

六、小結

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

注:本文的寫作曾參考了「形態各異的不規則窗體」一文。

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

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

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

windows 中不規則窗體的程式設計實現 一 序言 在絕大多數的windows 應用程式中,其窗體都是使用的正規正矩的矩形窗體 例如我們常用的,記事本 掃雷 等等。矩形窗體,具有程式設計實現簡單,風格簡潔的優點,所以在普通文件應用程式和 簡單小遊戲中使用足矣。但在某些娛樂遊戲程式中使用就略顯呆板些...

C 建立不規則窗體

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