MFC不規則視窗

2021-07-02 19:45:21 字數 1914 閱讀 7664



直接在onpaint()函式裡新增語句

setwindowlong(m_hwnd, gwl_exstyle, getwindowlong(m_hwnd, gwl_exstyle) | ws_ex_layered);

setlayeredwindowattributes(rgb(255,255,255), 0, lwa_colorkey);

rgb用拾色器拾取

第三個引數,有兩個取值:lwa_colorkey和lwa_alpha。前乙個表示使用透明色來設定透明,後乙個使用透明值來設定透明。如果使用前者,那麼透明值就無效,實現的就是透明色全部完全透明,其他顏色不透明;如果是有後者,那麼主視窗和其子視窗全部按照透明值來設定透明,透明色無效。

完成後 else }

setwindowlong這個函式是設定視窗的屬性的。第乙個引數是指定視窗的控制代碼,第二個是指定的要設定的屬性,第三個是屬性值。視窗控制代碼在視窗物件的m_hwnd成員裡儲存,gwl_exstyle這個是視窗擴充套件風格屬性的標記,如果你想看其他的,可以在這個巨集上面右擊,然後轉到定義就可以檢視其他的了。代表的意思就檢視msdn即可。這個風格的字首gwl_ 就是getwindowlong的縮寫,這樣說幫助你記憶這個標誌。字首後面就是具體的屬性。然後後面我們要設定的就是乙個擴充套件風格值,如果你想保留現有的各種風格,那麼就使用getwindowlong(m_hwnd,gwl_exstyle)| ws_ex_layered,getwindowlong(m_hwnd,gwl_exstyle)獲得乙個已有的擴充套件風格值,然後使用位或將層疊風格ws_ex_layered加進去。因為各種風格都是位標識的,只要其中的位為1就表示有這個風格,因此,ws_ex_layered表示1去操作相應的位,如果是位或就表示用1去位或相應的位,這樣就設定進去了。如果要取消,就使用&~ws_ex_layered,這個表示將層疊風格變為0,然後用0去位與這個風格,自然這一位就為0了,即取消了這個風格。getwindowlong得到原有的各種擴充套件風格,最好使用這種方式,否則如果直接在第三個引數中將層疊風格傳進去,那就只有乙個層疊的擴充套件風格了,可能會出現你不希望出現的情況。取得原有的擴充套件風格,然後位或即可設定相應的風格了。函式返回乙個設定後的風格的值,然後將這個值傳給第三個引數,就設定了這個風格。希望你好好把這一段看明白,在這是視窗風格時就很靈活了,任何視窗風格都可以通過這些位操作取消或者設定,比如最大化按鈕,最小化按鈕,標題欄等都可以,這樣你可以動態的設定視窗的樣式,如單擊按鈕使視窗沒有邊框了,再單擊一下又有邊框了。

設定好視窗風格後,開始第二句,設定視窗屬性。setlayeredwindowattributes(0,220,lwa_alpha);這一句和**段1有一點區別。**段1使用的是api函式,而這裡使用的是mfc的函式。這裡mfc也只不過是簡單的封裝,將第乙個視窗控制代碼引數放在了視窗物件的m_hwnd成員中了而已,僅此而已。如果你想使用api函式,使用::放在函式前面即可。這個函式的第乙個引數是透明色,第二個引數是透明度值,第三個是透明標誌。透明色的意思就是,指定的這個顏色在視窗顯示時就是透明的,其他顏色就不透明。通過這個你可以實現不規則的視窗。如,你將透明色設定為藍色,那麼視窗中凡是藍色的都透明的,其他顏色不透明。這個透明是完全看不見,而不是半透明。設定顏色的方法就是使用rgb巨集,如rgb(0,0,255),這就是純藍色。顏色值為0-255.rgb的順序就是紅綠藍。最終的顏色就是這三個顏色合成的顏色。rgb巨集返回的值就是colorref值,這個值就是第乙個引數需要的。第二個引數是透明度,取值是0-255,0就完全透明,255就完全不透明,中間值就是半透明。越靠近255就越不透明。這裡的透明是整個視窗的透明,子視窗也跟隨主視窗透明。第三個引數,有兩個取值:lwa_colorkey和lwa_alpha。前乙個表示使用透明色來設定透明,後乙個使用透明值來設定透明。如果使用前者,那麼透明值就無效,實現的就是透明色全部完全透明,其他顏色不透明;如果是有後者,那麼主視窗和其子視窗全部按照透明值來設定透明,透明色無效。lwa_ 就是layeredwindowattributes的縮寫。

3 不規則視窗

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

如何建立不規則視窗

vc 中提供了crgn類和setwindowrgn函式來建立別具一格的視窗。建立乙個新視窗首先要定義乙個crgn物件,並用各種初始化函式建立crgn類的區域,然後呼叫cwnd setwindowrgn函式建立不規則視窗。crgn類是從cgdiobject類派生二來的子類,crgn類用來確定乙個多邊形...

如何設定不規則視窗GTK

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