本來是寫在CSDN上的,現(xiàn)在轉(zhuǎn)一下過來。
創(chuàng)建一個(gè)透明窗體,一種方法是設(shè)置windows下窗體的一個(gè)擴(kuò)展窗口風(fēng)格,在WINNT及以后,Windows開始支持用來創(chuàng)建透明窗體的一個(gè)API函數(shù),先看一個(gè)效果圖:

這一個(gè)GDI繪圖的數(shù)字時(shí)鐘的窗口。實(shí)現(xiàn)了窗口的半透明效果。實(shí)現(xiàn)方法如下:
1
#define _WIN32_WINNT 0x5000 //定義WINNT的宏
2
//
3
hwnd = CreateWindow(szAppName,TEXT("Noble Qiao~"),
4
WS_POPUP | WS_SYSMENU | WS_VISIBLE ,
5
::GetSystemMetrics(SM_CXSCREEN)/2,
6
::GetSystemMetrics(SM_CYSCREEN)/2,
7
160,45,
8
NULL,NULL,hInstance,NULL);
9
//
10
::SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
11
SetLayeredWindowAttributes(hwnd,0,(255*70)/150,LWA_ALPHA);

2


3

4

5

6

7

8

9


10

11

SetLayeredWindowAttributes(hwnd,0,(255*70)/150,LWA_ALPHA);設(shè)置了窗體的屬性,為透明效果,其中第二個(gè)參數(shù)為alpha值,即透明度。
另外,我在使用一個(gè)游戲引擎HGE做應(yīng)用時(shí),發(fā)現(xiàn)了關(guān)于這個(gè)API函數(shù)的一個(gè)問題,我把這個(gè)函數(shù)的調(diào)用放在初始化一些用于渲染場(chǎng)景的指針變量之前時(shí),在 winxp下運(yùn)行就會(huì)運(yùn)行出錯(cuò),而在 Vista 下完全正常。
我猜想在XP下,這個(gè)函數(shù)被調(diào)用后,直接調(diào)用wndproc,此時(shí)如果游戲資源(如紋理)沒有被初始化,就會(huì)出錯(cuò);而在Vista中沒有這個(gè)問題,可能是Microsoft對(duì)這個(gè)API函數(shù)做了一定修改。