由於工作的需要,最近一直在研究異形視窗的實現。網上也有一些相關的文章,能夠滿足各式各樣的異形視窗要求。既然花了時間去研究,就想好好的將其總結記錄下來,以免今後遇到類似問題,還要從新花時間去研究。
我需要完成的效果很簡單,但實現思路適合大部分的異形視窗。
圖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在onpaint()函式中新增如下**:bool cdragmovedialog::create(hwnd hparentwnd)
2
1 bitblt(hdc,0,0,m_rect.width,m_rect.height,hmemdc,0,0二、updatelayeredwindow函式,srccopy);
2 setlayeredwindowattributes(this->getsafehwnd(),0,155,1);
該函式是根據png影象的透明值,自動生成相應的不規則視窗。但該函式生成的異形視窗不能為子視窗,同時,
由於設定視窗為ws_ex_layered風格,因此視窗類只有在第一次啟動時才會呼叫onpaint()函式,除非通過主動呼叫invalidaterect(null,true)函式。
**實現如下:
1.定義透明結構體
blendfunction m_blend; //2. 在create函式中對透明結構體賦值透明屬性
1 m_blend.blendop=ac_src_over; //3.在onpaint()函式中新增繪製**:theonlyblendopdefinedinwindows2000
2 m_blend.blendflags=0; //
nothingelseisspecial...
3 m_blend.alphaformat=ac_src_alpha; //
...4 m_blend.sourceconstantalpha=255;//
ac_src_alpha
1三、使用hrgn區域組合建立//----繪製視窗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;
效率不高,比較慢!!
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 壓縮命令 後面的引數一定...