VB API 之 透明窗体创建

  首先我们要用到的API函数有SetWindowLong,GetWindowLong,SetLayeredWindowAttributes。

SetWindowLong函数原型:

Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) _
As Long

函数功能:

  该函数用来改变指定窗口的属性

参数:

hwnd: Long     //窗口的句柄

nIndex:Long   //大于等于0的偏移值。可以是以下指定的值:

常量
常量值
意义
GWL_EXSTYLE
-20
设定一个新的扩展风格。
GWL_HINSTANCE
-6
设置一个新的应用程序实例句柄。
GWL_ID
-12
设置一个新的窗口标识符。
GWL_STYLE
-16
设定一个新的窗口风格。
GWL_USERDATA
-21
设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值。
GWL_WNDPROC
-4
为窗口过程设定一个新的地址。
GWL_HWNDPARENT -8   改变子窗口的父窗口,应使用SetParent函数。
当hWnd参数标识了一个对话框时,也可使用下列值:
常量
常量值
意义
DWL_DLGPROC
DWLP_MSGRESULT + sizeof(LRESULT)
设置对话框过程的新地址。
DWL_MSGRESULT
0
设置在对话框过程中处理的消息的返回值。
DWL_USER
DWLP_DLGPROC + sizeof(DLGPROC)
设置的应用程序私有的新的额外信息,例如一个句柄或指针。

dwNewLong

指定的替换值。
dwNewLong中可以使用以下一些列表控件的专用风格:
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT
这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:
大图标显示,小图标显示,列表显示,详细报表显示
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
LVS_SINGLESEL 同时只能选中列表中一项
返回值:成功返回一个32位整数的值,失败为0.
  
  GetWindowLong函数原型

Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) _
As Long

函数功能:
  该函数获得指定窗口的有关信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。
 
参数:
hWnd :Long  //窗口的句柄
nIndex:Long //大于等于0的偏移值。可以是以下值:
一:

  
意义
  
GWL_EXSTYLE
(-20)
获得扩展窗口风格。
GWL_HINSTANCE
(-6)
获得应用实例的句柄。
GWL_HWNDPARENT
(-8)
如果父窗口存在,获得父窗口句柄。
GWL_ID
(-12)
获得窗口标识。
GWL_STYLE
(-16)
获得窗口风格。
GWL_USERDATA
(-21)
获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
GWL_WNDPROC
(-4)
获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用CallWindowProc函数调用窗口过程。
[1] 
hWnd参数为对话框句柄时,还可用下列值:

  
意义
  
DWL_DLGPROC
(4)
获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
DWL_MSGRESULT
(0)
获得在对话框过程中一个消息处理的返回值。
DWL_USER
(8)
获得应用程序私有的额外信息,例如一个句柄或指针。
[1] 
返回值: 如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。 
 
  SetLayeredWindowAttributes函数原型

Private Declare Function SetLayeredWindowAttributes Lib "user32" _
(ByVal hwnd As Long, _
ByVal crKey As Long, _
ByVal bAlpha As Long, _
ByVal dwFlags As Long) _
As Long

函数功能:此函数用于设置分层窗口透明度,常和 UpdateLayeredWindow 函数结合使用

参数:

hwnd:Long     //窗口句柄

crkey:Long    //指定需要透明的背景颜色值,可用RGB()宏

bAlpha:Long  //设置透明度,0表示完全透明,255表示不透明

dwFlags:Long //透明方式

其中,dwFlags参数可取以下值:
LWA_ALPHA时:crKey参数无效,bAlpha参数有效;
LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
代码如下:
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 GetWindowLong Lib "user32" _
                Alias "GetWindowLongA" _
                (ByVal hwnd As Long, _
                ByVal nIndex As Long) _
                As Long

Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA As Long = &H2
Private Const WS_EX_LAYERED As Long = &H80000

Private Declare Function SetLayeredWindowAttributes Lib "user32" _
                (ByVal hwnd As Long, _
                ByVal crKey As Long, _
                ByVal bAlpha As Long, _
                ByVal dwFlags As Long) _
                As Long

Private Sub Form_Load()
  Dim p As Long
  p = GetWindowLong(Me.hwnd, GWL_EXSTYLE) '取得当前窗口属性
  Call SetWindowLong(Me.hwnd, GWL_EXSTYLE, p Or WS_EX_LAYERED)
  '加上一个半透明属性
  Call SetLayeredWindowAttributes(Me.hwnd, 0, 125, LWA_ALPHA)
End Sub

posted @ 2014-10-29 19:37  Delphi爱好者2014  阅读(810)  评论(0编辑  收藏  举报