建立一個MFC Wizard項目,基于對話框。
我們來看看下面這段代碼:
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
//加載dll
HINSTANCE hInst=LoadLibrary("User32.dll");
if(hInst)
{
typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD);
Fun fun=NULL;
//找到dll中的SetLayeredWindowAttributes函數首位址
fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(fun)
{
//調用SetLayeredWindowAttributes函數
fun(this->GetSafeHwnd(),0,200,2);
}
//釋放dll
FreeLibrary(hInst);
}
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
//加載dll
HINSTANCE hInst=LoadLibrary("User32.dll");
if(hInst)
{
typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD);
Fun fun=NULL;
//找到dll中的SetLayeredWindowAttributes函數首位址
fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(fun)
//調用SetLayeredWindowAttributes函數
fun(this->GetSafeHwnd(),0,200,2);
}
//釋放dll
FreeLibrary(hInst);
把上面的這段代碼放在需要更改對話框背景透明度的地方,例如響應OK按鈕函數OnOK裡面或者OnInitDialog函數裡。
然後點選試試什麼效果:
SetLayeredWindowAttributes函數用來設定視窗透明度,看看解析:
<a href="http://baike.baidu.com/view/1329156.htm?fr=ala0_1">http://baike.baidu.com/view/1329156.htm?fr=ala0_1</a>
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
hWnd是透明窗體的句柄,
crKey為掩碼的顔色,可以用RGB(r,g,b)來指定。
bAlpha是不透明度,取值範圍是(0,255),其中0代表全透明,255代表不透明。
dwFlags是透明方式,可以取兩個值:
當取值為LWA_ALPHA時,crKey參數無效,bAlpha參數有效;
當取值為LWA_COLORKEY時,窗體中的所有顔色為crKey的地方将變為透明,bAlpha參數無效。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
也可以取兩個值的組合:LWA_ALPHA Or LWA_COLORKEY。這樣crKey的地方将變為全透明,而其它地方根據bAlpha參數确定透明度。
要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴充屬性,方法:
Dim rtn As Long
rtn = GetWindowLong(Me.hWnd, -20)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong (Me.hWnd, -20, rtn)
(舊的sdk沒有定義WS_EX_LAYERED,是以可以直接指定為&H80000).
WS_EX_LAYERED = &H80000