VB通过windows API实现窗口透明,部分透明,CreateRectRgn,CombineRgn

来源:互联网 发布:pop ssl 端口 编辑:程序博客网 时间:2024/04/28 07:21

VB通过windows API实现窗口透明,部分透明

1 效果图展示

这里写图片描述
这里写图片描述

2 相关API函数介绍

Public Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

创建一个由点(x1,y1)到(x2,y2)的矩形区域,不用时要用DeleteObject函数删除该区域

Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long

将两个区域组合为一个新区域,参数nCombineMode为组合两区域的方法。可设置为如下常数

nCombineMode=1 ‘RGN_AND

nCombineMode=2 ‘RGN_COPY

nCombineMode=3 ‘RGN_DIFF

nCombineMode=4 ‘RGN_XOR

这里为了使窗口透明,我们使用异或运算,令nCombineMode=4

Public Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long

设置一个窗口的区域

3 VB实例

新建一个模块,复制以下代码

Option ExplicitPublic Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long '矩形Public Declare Function CreateEllipticRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long '椭圆形Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As LongPublic Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As LongDeclare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As LongPublic Const RGN_MODE = 4 'XOR 异或

新建一个窗体,放两个按钮,改名为CmdHide,CmdQuit,然后把下面代码复制上就行了

Option ExplicitPrivate Sub Form_Load()    Me.Width = 6735    Me.Height = 5175    Me.ScaleMode = vbPixels    CmdHide.Move 160, 96, 73, 41    CmdQuit.Move 232, 96, 73, 41End SubPrivate Sub CmdQuit_Click()    EndEnd SubPrivate Sub CmdHide_Click()    CmdHide.Enabled = True    CmdHide.Enabled = False    Dim a, b, c As Long    a = CreateRectRgn(0, 0, Me.Width, Me.Height)    c = CreateRectRgn(0, 0, 0, 0)    '上面的消掉    b = CreateRectRgn(0, 0, Me.Width, CmdHide.Top + 24)    CombineRgn c, a, b, RGN_MODE    '左边消掉    a = c    b = CreateRectRgn(0, CmdHide.Top + 24, CmdHide.Left, CmdHide.Top + 24 + CmdHide.Height)    CombineRgn c, a, b, RGN_MODE    '右边消掉    a = c    b = CreateRectRgn(CmdQuit.Left + CmdQuit.Width, CmdQuit.Top + 24, Me.Width, CmdQuit.Top + 24 + CmdQuit.Height)    CombineRgn c, a, b, RGN_MODE    '下边消掉    a = c    b = CreateRectRgn(0, CmdHide.Top + 24 + CmdHide.Height, Me.Width, Me.Height)    CombineRgn c, a, b, RGN_MODE    '完成,设置窗体    SetWindowRgn Me.hWnd, c, TrueEnd Sub

利用这些API函数可以做很多有趣的东西,大家可以自己动手试一试。

0 0