VC 實現視窗異形

2021-06-17 20:17:07 字數 3273 閱讀 8390

由於工作的需要,最近一直在研究異形視窗的實現。網上也有一些相關的文章,能夠滿足各式各樣的異形視窗要求。既然花了時間去研究,就想好好的將其總結記錄下來,以免今後遇到類似問題,還要從新花時間去研究。

我需要完成的效果很簡單,但實現思路適合大部分的異形視窗。

圖1 效果圖

總結了下,實現異形視窗的方法分為以下幾種:

一、setlayeredwindowattributes函式

該函式能夠實現整個視窗的透明效果,以及指定顏色透明效果。其原型如下:

bool winapi setlayeredwindowattributes( __in  hwnd hwnd, __in  colorref crkey, __in  byte balpha, __in  dword dwflags );

hwnd 為需要變形的視窗控制代碼

crkey  為指定透明顏色

balpha 為指定透明度

dwflags 標示位,其值為lwa_alpha時,引數balpha 作為決定視窗透明的標準,crkey 無效;當其值為lwa_colorkey時,引數crkey 有效。

**實現如下:

在create時指定為ws_popup型別,透明的視窗不能為子視窗

1

bool cdragmovedialog::create(hwnd hparentwnd)

2

在onpaint()函式中新增如下**:

1     bitblt(hdc,0,0,m_rect.width,m_rect.height,hmemdc,0,0

,srccopy);

2 setlayeredwindowattributes(this->getsafehwnd(),0,155,1);

二、updatelayeredwindow函式

該函式是根據png影象的透明值,自動生成相應的不規則視窗。但該函式生成的異形視窗不能為子視窗,同時,

由於設定視窗為ws_ex_layered風格,因此視窗類只有在第一次啟動時才會呼叫onpaint()函式,除非通過主動呼叫invalidaterect(null,true)函式。

**實現如下:

1.定義透明結構體

blendfunction    m_blend;                //

透明屬性

2. 在create函式中對透明結構體賦值

1      m_blend.blendop=ac_src_over; //

theonlyblendopdefinedinwindows2000

2 m_blend.blendflags=0; //

nothingelseisspecial...

3 m_blend.alphaformat=ac_src_alpha; //

...4 m_blend.sourceconstantalpha=255;//

ac_src_alpha

3.在onpaint()函式中新增繪製**:

1

//----繪製視窗23

4 hdc hdctemp =hdc;

5 hdc hmemdc =createcompatibledc(hdctemp);

6 hbitmap hbitmap =createcompatiblebitmap(hdctemp, m_rect.width,m_rect.height);

7selectobject(hmemdc, hbitmap);

89 hdc hdcscreen =hdc;

10rect rct;

11 getwindowrect(&rct);

12 point ptwinpos =;

1314

graphics imagegraphics(hmemdc);

15//

設定層次視窗

16 dword dwexstyle=getwindowlong(gwl_exstyle);

1718

if((dwexstyle&0x80000)!=0x80000)19

2223 point ptsrc = ;

24 size sizewindow =;

2526

//完成透明不規則視窗的繪製

27 updatelayeredwindow(this->getsafehwnd(), hdcscreen, &ptwinpos, &sizewindow, hmemdc, &ptsrc, 255, &m_blend, ulw_alpha);

2829

//釋放空間

30imagegraphics.releasehdc(hmemdc);

31deleteobject(hbitmap);

32deletedc(hmemdc);

33 hmemdc =null;

34 hdcscreen =null;

35 hdctemp = null;

三、使用hrgn區域組合建立

效率不高,比較慢!!

1

//----繪製異形視窗23

hrgn wndrgn;45

//建立總的窗體區域,初始region為0

6 wndrgn = createrectrgn(0,0,0,0);7

inty;

8for(y=0;y<=m_rect.height ;y++)

9while(ix

3637 setwindowrgn(this->getsafehwnd(),wndrgn,true);

3839

if ( wndrgn != null )deleteobject(wndrgn);

參考**:

1.updatelayeredwindow函式:

注意:1. windows 8: thews_ex_layeredstyle is supported for top-level windows and child windows. previous windows versions supportws_ex_layeredonly for top-level windows.

2. 有些2003和xp的系統不支援ws_ex_layered風格,因此無法顯示透明視窗。解決辦法目前還木有找到,盡提供以下參考 :

VC動畫視窗的實現

函式功能 該函式 能在顯示與隱藏視窗時能產生特殊的效果。有兩種型別的動畫效果 滾動動畫和滑動動畫。函式原型 bool animatewindow hwnd hwnd,dword dwtime,dword dwflags 引數 hwnd 指定產生動畫的視窗的控制代碼。dwtime 指明動畫持續的時間 ...

VC如何實現透明視窗

vc如何實現透明視窗 選擇自 leisureful 的 blog 在對話方塊初始化函式中加入 define lwa colorkey 0x00000001 define ws ex layered 0x00080000 typedef bool winapi lpfnsetlayeredwindow...

VC實現解壓 隱藏解壓視窗

當前路徑解壓命令 shellexecute null,open winrar.exe e abc.rar abc.txt sw hide 絕對路徑 shellexecute null,open winrar.exe x c abc.rar c abc.txt sw hide 壓縮命令 後面的引數一定...