请教VB利用API的问题

来源:百度知道 编辑:UC知道 时间:2024/06/23 09:14:23
这是一个用API将文本框变透明的代码:
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
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1

Private Sub Form_Load()
Text1.BackColor = vbBlue
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, vbBlue, 0, LWA_COLORKEY
End Sub
我知道SetLayeredWindowAttri

要使用SetLayeredWindowAttributes设置Layered属性,就要先给窗体添加Layered样式
添加Layered样式通过 使用SetWindowLong函数设置窗体的ExStyle实现。也就是这一句:
SetWindowLong hwnd, GWL_EXSTYLE, rtn
要“添加”Layered样式,就要知道原来的样式值,因此要用到GetWindowLong

Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE) '取得窗体的扩展样式值
rtn = rtn Or WS_EX_LAYERED '原始值上添加Layered样式
SetWindowLong hwnd, GWL_EXSTYLE, rtn '设置窗体扩展样式值
SetLayeredWindowAttributes hwnd, vbBlue, 0, LWA_COLORKEY '设置Layered属性

要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性

其实下面代码环环相扣,必不可少。

Private Sub Form_Load()
Text1.BackColor = vbBlue '设置text1背景色为蓝色,下面有用
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn '把text1的样式设置为扩展模式,没有这一步下面无法实现
SetLayeredWindowAttributes hwnd, vbBlue, 0, LWA_COLORKEY '对text1控件中的蓝色部分进行透明处理
End Sub