函數(shù)SetLayeredWindowAttributes
使用這個(gè)函數(shù),可以輕松的實(shí)現(xiàn)半透明窗體。按照微軟的要求,透明窗體窗體在創(chuàng)建時(shí)應(yīng)使用WS_EX_LAYERED參數(shù)(用CreateWindowEx),或者在創(chuàng)建后設(shè)置該參數(shù)(用SetWindowLong),我選用后者。全部函數(shù)、常量聲明如下:
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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為顏色值,bAlpha是透明度,取值范圍是[0,255],dwFlags是透明方式,可以取兩個(gè)值:當(dāng)取值為L(zhǎng)WA_ALPHA時(shí),crKey參數(shù)無(wú)效,bAlpha參數(shù)有效;當(dāng)取值為L(zhǎng)WA_COLORKEY時(shí),bAlpha參數(shù)有效而窗體中的所有顏色為crKey的地方將變?yōu)橥该鳎@個(gè)功能很有用:我們不必再為建立不規(guī)則形狀的窗體而調(diào)用一大堆區(qū)域分析、創(chuàng)建、合并函數(shù)了,只需指定透明處的顏色值即可,哈哈哈哈!請(qǐng)看具體代碼。
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1
代碼一:一個(gè)半透明窗體
Private Sub Form_Load()
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
End Sub
代碼二:形狀不規(guī)則的窗體
Private Sub Form_Load()
Dim rtn As Long
BorderStyler=0
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY ´將扣去窗口中的藍(lán)色
End Sub
使用這個(gè)函數(shù),可以輕松的實(shí)現(xiàn)半透明窗體。按照微軟的要求,透明窗體窗體在創(chuàng)建時(shí)應(yīng)使用WS_EX_LAYERED參數(shù)(用CreateWindowEx),或者在創(chuàng)建后設(shè)置該參數(shù)(用SetWindowLong),我選用后者。全部函數(shù)、常量聲明如下:
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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為顏色值,bAlpha是透明度,取值范圍是[0,255],dwFlags是透明方式,可以取兩個(gè)值:當(dāng)取值為L(zhǎng)WA_ALPHA時(shí),crKey參數(shù)無(wú)效,bAlpha參數(shù)有效;當(dāng)取值為L(zhǎng)WA_COLORKEY時(shí),bAlpha參數(shù)有效而窗體中的所有顏色為crKey的地方將變?yōu)橥该鳎@個(gè)功能很有用:我們不必再為建立不規(guī)則形狀的窗體而調(diào)用一大堆區(qū)域分析、創(chuàng)建、合并函數(shù)了,只需指定透明處的顏色值即可,哈哈哈哈!請(qǐng)看具體代碼。
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1
代碼一:一個(gè)半透明窗體
Private Sub Form_Load()
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
End Sub
代碼二:形狀不規(guī)則的窗體
Private Sub Form_Load()
Dim rtn As Long
BorderStyler=0
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY ´將扣去窗口中的藍(lán)色
End Sub

