vb6 WIN2000 调试成功 Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 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 Sub TraningForm(s As Integer) Dim LRtn As Long LRtn = GetWindowLong(hwnd, GWL_EXSTYLE) LRtn = LRtn Or &H80000 SetWindowLong hwnd, (-20), LRtn SetLayeredWindowAttributes hwnd, 0, s, &H2 End Sub Private Sub Form_Load() Call TraningForm(Int(80)) End Sub
如果你使用的是NT,2000或者以上,可以使用以下API函数 Public Declare Function SetLayeredWindowAttributes Lib "user32" ( _ ByVal hwnd As Long, _ ByVal crKey As Long, _ ByVal bAlpha As Byte, _ ByVal dwFlags As Long) _ As Long Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long) _ As Long Public Const WS_EX_LAYERED = &H80000 Public Const GWL_EXSTYLE = (-20) Public Const LWA_ALPHA = &H2 Public Const LWA_COLORKEY = &H1 Dim rtn As Long rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes Me.hwnd, 0, dwNewLong, LWA_ALPHA
WIN2000 调试成功
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
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 Sub TraningForm(s As Integer)
Dim LRtn As Long
LRtn = GetWindowLong(hwnd, GWL_EXSTYLE)
LRtn = LRtn Or &H80000
SetWindowLong hwnd, (-20), LRtn
SetLayeredWindowAttributes hwnd, 0, s, &H2
End Sub
Private Sub Form_Load()
Call TraningForm(Int(80))
End Sub
Public Declare Function SetLayeredWindowAttributes Lib "user32" ( _
ByVal hwnd As Long, _
ByVal crKey As Long, _
ByVal bAlpha As Byte, _
ByVal dwFlags As Long) _
As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) _
As Long
Public Const WS_EX_LAYERED = &H80000
Public Const GWL_EXSTYLE = (-20)
Public Const LWA_ALPHA = &H2
Public Const LWA_COLORKEY = &H1 Dim rtn As Long rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes Me.hwnd, 0, dwNewLong, LWA_ALPHA
那是受Windows对窗体的绘制方式的限制
Windows系统实际上是把所有显示的窗体的内容放在一个位图中
等窗体需要更新时
就会设置窗体的绘制区域(就是把在它上面的窗体的区域屏蔽掉)
在发送WM_PAINT、WM_NCPAINT消息让程序去绘制
所以本窗体下屏幕是不会更新的
而半透明的计算是需要下层图形的(透明计算公式:绘制的RGB分量 = 下层图形该点的RGB分量 + CLng((上层图形该点的RGB分量 - 下层图形该点的RGB分量) * 透明度),0<=透明度<=1,0完全透明,1不透明)至于游戏中为什么能半透明
原理实在是太简单
PhotoShop用过吗
就是用多图层合并办到的你没有注意吗
游戏中的背景层都是这个游戏的画面
根本不是Windows桌面
而且此窗体非彼窗体
这根本不是Windows系统的窗体
这是游戏中画出来的窗体这样 上层图形、下层图形 都知道了,计算一下显示的颜色,半透明效果不就出来了!