如何建立不規則視窗

2021-04-13 08:59:33 字數 1841 閱讀 7820

vc++中提供了crgn類和setwindowrgn函式來建立別具一格的視窗。建立乙個新視窗首先要定義乙個crgn物件,並用各種初始化函式建立crgn類的區域,然後呼叫cwnd::

setwindowrgn函式建立不規則視窗。

crgn類是從cgdiobject類派生二來的子類,crgn類用來確定乙個多邊形、橢圓形或由多邊形和橢圓合成的圖形範圍。crgn類有三個比較常用的成員函式。

1、createrectrgnindirect

該函式用來建立乙個矩形區域,原型為:

createrectrgnindirect(lpcrect lprect);

引數lprect用來指定待建立的矩形區域在視窗客戶區中的座標。

2、createellipticrgnindirect函式

該函式用來建立乙個橢圓區域,原型為:

createellipticrgnindirect(lpcrect lprect);

引數lprect用來指定待建立的橢圓區域在視窗客戶區中的座標。如果引數lprect的right座標和left座標的差等於button座標與top座標的差,那麼所建立的區域為乙個圓形區域。

3、createpolygonrgn函式

該函式用來建立乙個多邊形區域,原型為:

createpolygonrgn(lppoint lppoints, int ncount, int nmode);

引數lppoints為乙個指向point結構的陣列指標。在point結構陣列中,每個point結構項用來確定多邊形頂點在視窗使用者區中的座標。引數ncount用於指定point結構陣列中結構項的數目,也就是多邊形的頂點數。而nmode用於指定多邊形的填充方式,通常取值為alternate。下面一段**用於建立乙個三角形區域:

crect rcdialog;

getclientrect(rcdialog);

points[0].x = rcdialog.width()/2;

points[0].y = 0;

points[1].x = rcdialog.width();

points[1].y = rcdialog.height();

points[2].x = 0;

points[2].y = rcdialog.height();

m_rgn.createpolygonrgn(points,3,alternate);

::setwindowrgn(getsafehwnd(),(hrgn)m_rgn,true);

利用上述語句建立了乙個區域之後,接下來就可以呼叫cwnd::setwindowrgn函式來建立視窗了。該函式原型為:

cwnd::setwindowrgn(hrgn hrgn, bool bredraw);

其中引數hrgn為乙個已經建立的crgn類的控制代碼;引數bredraw如果設定為true,則在視窗次序發生變化時,系統向視窗傳送wm_windowposchanging和wm_windowposchanged訊息用於重繪視窗。

如果要建立更複雜的視窗,則可以通過combinergn函式把幾個非矩形區域結合起來,該函式原型為:

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

其中,引數prgn1和prgn2分別指向參與合成的不規則區域;引數ncombinemode用於指定結合的方式:

* rgn_and :表示最後形成的區域是prgn1和prgn2的重疊部分;

* rgn_diff :表示最後形成的區域是prgn1中不包含prgn2的部分;

* rgn_or :表示最後形成的區域同時包含prgn1和prgn2;

* rgn_xor :表示最後形成的區域同時包含prgn1和prgn2,但不包含重疊部分。

如何設定不規則視窗GTK

為了體現高度的可制定性.對於gtk來說,肯定可以實現不規則的視窗.但是如何實現呢?在網上找到了一些資料.主要是用透明的來實現的.下面我們來分析一下實現的過程.pixbuf gdk pixbuf new from file 1.png null gdk pixbuf render pixmap and...

MFC不規則視窗

直接在onpaint 函式裡新增語句 setwindowlong m hwnd,gwl exstyle,getwindowlong m hwnd,gwl exstyle ws ex layered setlayeredwindowattributes rgb 255,255,255 0,lwa co...

3 不規則視窗

1.不規則視窗 原理 用乙個位圖畫刷繪製視窗背景,然後把想要透明的顏色設定為透明色,就可以使視窗變成任意形狀。1 視窗處理函式 2lresult callback bitmapwindowproc hwnd hwnd,uint message,wparam wparam,lparam lparam ...