一、序言
二、實現原理
所有的 windows 窗體都位於乙個稱為「region」中,窗體的大小如果超出「region」的範圍,windows 會自動裁剪超出"region"範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟:第一步就是建立不規則"region".第二步就是將窗體放到建立的「region」中。
其中第二步很簡單就呼叫一條語句即可。在sdk中呼叫api函式setwindowrgn,該函式原型如下:
1.
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函式中,可將該對話方塊變成橢圓窗體:
圖一 橢圓窗體效果圖
四、作圖路徑法建立」region」
使用該方法建立」region」的過程如下:
第一步繪製所要建立的窗體形狀。
該步驟中使用到cdc類中的一些成員函式如下:
1.
bool
cdc::beginpath( );
呼叫該函式後當前裝置環境(dc)開始追蹤繪圖的過程。
1.
int
cdc::setbkmode(
int
nbkmode );
設定繪圖時的背景模式,此應用中nbkmode必須取值為transparent 。即設定繪圖時背景不發生變化。
1.
bool
cdc::endpath( );
呼叫該函式後當前裝置環境(dc)結束追蹤繪圖的過程。
開始繪圖前,先呼叫beginpath,然後呼叫setbkmode。接下去就可呼叫cdc的其他繪圖函式作圖,例如arc,anglearc,lineto,moveto,roundrect,,textout等等。繪圖完畢呼叫endpath().
第二步將繪製的結果轉成」region」.
此步驟中使用sdk api函式
1.
hrgn
pathtoregion(
hdc
hdc );
hdc為作圖dc的控制代碼, cdc類中的m_hdc成員變數可做此引數傳入。示例,將下面**加入某個按鈕單擊事件中,可以將當前窗體變為字串」hello」的形狀
01.
void
ctestdlg::ontest()
02.
35.
}
cclientdc是cdc的派生類,故此該類具有所有cdc類的成員變數和成員函式。
圖二 hello形狀的窗體效果圖
五、根據影象建立」region」
此法建立不規則窗體比較複雜。首先準備一張含有目標窗體形狀的,設定透明色即將中部不屬於窗體形狀的部分,標記成同一種顏色,例如藍色rgb(0,0,255).程式執行後先裝入。然後逐個掃瞄的每個畫素,如這個畫素不屬於透明色,則在相應位置建立乙個只含乙個畫素的「region」然後將這些小」region 」合併起來組成乙個任意形狀的」region」.這裡將使用到crgn的乙個成員函式 :
1.
int
crgn::combinergn( crgn* prgn1, crgn* prgn2,
int
ncombinemode );
其中prgn1,prgn2為要合併的兩個「region」,ncombinemode為合併的方式,此應用中取rgn_or,即兩」region」全部合併去處重複部分。**實現如下:
01.
void
setupregion(
02.
cdc *pdc,
//窗體的dc指標
03.
cbitmap &cbitmap,
//含有窗體形狀的點陣圖物件
04.
colorref
transcolor
//透明色
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...