使窗體擁有透明效果的API

2021-04-12 21:05:59 字數 1749 閱讀 5371

使窗體擁有透明效果的api

一、背景

flashget的透明效果大家羨慕吧.傳統的windows應用程式想實現半透明效果,一般來說需要處理自己的視窗的wm_paint訊息視窗,很麻煩.現在好了,setlayeredwindowattributes是windows的新api,win2000以上才支援,它能使使窗體擁有透明效果.我在google搜了下,介紹setlayeredwindowattributes的文章大多是delphi的和vb的.好不容易找到一篇vc的,依法炮製後,vc的ide卻說我setlayeredwindowattributes沒有定義!後來想想應該是我的sdk沒有公升級.於是我在vc安裝目錄搜尋"setlayeredwindowattributes"的"*.h"檔案,果然沒有.怎麼辦?公升級sdk吧.我去微軟的**一看,新的sdk就核心sdk就有二百多m呢(解壓後更大),可憐我的硬碟沒有乙個分割槽大於200m的了!怎麼辦,這麼好玩的api給看不給用:( 失望之餘,我忽然想到了未公開api的使用的方法.這是個系統支援,自己sdk卻沒有的api,就把他當做windows未公開api試試!

二、簡單介紹一下setlayeredwindowattributes:(詳見msdn)

bool setlayeredwindowattributes(hwnd hwnd, // handle to the layered windowcolorref crkey, // specifies the color keybyte balpha, // value for the blend functiondword dwflags // action);

windows nt/2000/xp: included in windows 2000 and later.

windows 95/98/me: unsupported.

header: declared in winuser.h; include windows.h.

library: use user32.lib.

一些常量:

ws_ex_layered = 0x80000;

lwa_alpha = 0x2;

lwa_colorkey=0x1

其中dwflags有lwa_alpha和lwa_colorkey

lwa_alpha被設定的話,通過balpha決定透明度.

lwa_colorkey被設定的話,則指定被透明掉的顏色為crkey,其他顏色則正常顯示.

注:要使使窗體擁有透明效果,首先要有ws_ex_layered擴充套件屬性(舊sdk也沒有的).

三、例子**:

在oninitdialog()加入:

//加入ws_ex_layered擴充套件屬性setwindowlong(this->getsafehwnd(),gwl_exstyle,getwindowlong(this->getsafehwnd(),gwl_exstyle)^0x80000);hinstance hinst = loadlibrary("user32.dll"); if(hinst)
唉!如果裝了最新sdk就不用那麼麻煩了!

怎麼樣,效果不錯吧!稍加修改還可以作出淡出淡入的效果. 注意第三個引數(128)不要取得太小了,為0的話完全透明,你就找不到窗體了!

小小心得,一吐為快.希望對初學者有所幫助.如有不妥,歡迎指正.

使窗體擁有透明效果的API

一 背景 flashget的透明效果大家羨慕吧.傳統的windows應用程式想實現半透明效果,一般來說需要處理自己的視窗的wm paint訊息視窗,很麻 煩.現在好了,setlayeredwindowattributes是windows的新api,win2000以上才支援,它能使使窗體擁有透明效 果...

使窗體擁有透明效果的API

cwnd setlayeredwindowattributes 設定不透明性和透明性 bool setlayeredwindowattributes colorref crkey,byte balpha,dword dwflags dwflags的取值是 lwa alpha 0x2 lwa colo...

在C 中呼叫系統API使窗體下擁有陰影效果

2007 12 16 00 09 昨天晚上看msdn看見的一段通過使用setclasslong函式使視窗下面擁有乙個陰影效果,研究 找資料弄了半個小時把它運用在了c 2.0上,特此一貼。using system.runtime.interopservices 然後再視窗類的隨便哪個地方加上 cons...