Excel VBA 特殊形状窗体代码详解及CreateEllipticRgn及CombineRgn图解,搭配API函数说明查看

Excel VBA 特殊形状窗体代码

'->Forms
'  Module
'  ClassModules
Option Explicit

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

#If Win64 Then
    Private Declare PtrSafe Function SendMessage _
    Lib "user32" _
    Alias "SendMessageA" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    lParam As Any) _
    As LongPtr
    
    Private Declare PtrSafe Function CreateEllipticRgn _
    Lib "gdi32" ( _
    ByVal X1 As Long, _
    ByVal Y1 As Long, _
    ByVal X2 As Long, _
    ByVal Y2 As Long) _
    As LongPtr
    
    Private Declare PtrSafe Function CombineRgn _
    Lib "gdi32" ( _
    ByVal hDestRgn As LongPtr, _
    ByVal hSrcRgn1 As LongPtr, _
    ByVal hSrcRgn2 As LongPtr, _
    ByVal nCombineMode As Long) _
    As Long
    
    Private Declare PtrSafe Function SetWindowRgn _
    Lib "user32" ( _
    ByVal hwnd As LongPtr, _
    ByVal hRgn As LongPtr, _
    ByVal bRedraw As Long) _
    As Long
    
    Private Declare PtrSafe Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) _
    As LongPtr
    
    Private Declare PtrSafe Function ReleaseCapture _
    Lib "user32" () _
    As Long
#Else

    Private Declare Function SendMessage _
    Lib "user32" _
    Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) _
    As Long
    
    Private Declare Function CreateEllipticRgn _
    Lib "gdi32" ( _
    ByVal X1 As Long, _
    ByVal Y1 As Long, _
    ByVal X2 As Long, _
    ByVal Y2 As Long) _
    As Long
    
    Private Declare Function CombineRgn _
    Lib "gdi32" ( _
    ByVal hDestRgn As Long, _
    ByVal hSrcRgn1 As Long, _
    ByVal hSrcRgn2 As Long, _
    ByVal nCombineMode As Long) _
    As Long
    
    Private Declare Function SetWindowRgn _
    Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal hRgn As Long, _
    ByVal bRedraw As Long) _
    As Long
    
    Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) _
    As Long
    
    Private Declare Function ReleaseCapture _
    Lib "user32" () _
    As Long

    Private Declare Function CreateRectRgn _
    Lib "gdi32" ( _
    ByVal X1 As Long, _
    ByVal Y1 As Long, _
    ByVal X2 As Long, _
    ByVal Y2 As Long) _
    As Long
    
    Private Declare Function CreateRoundRectRgn _
    Lib "gdi32" ( _
    ByVal X1 As Long, _
    ByVal Y1 As Long, _
    ByVal X2 As Long, _
    ByVal Y2 As Long, _
    ByVal X3 As Long, _
    ByVal Y3 As Long) _
    As Long
    
    Private Declare Function DeleteObject _
    Lib "gdi32" ( _
    ByVal hObject As Long) _
    As Long
#End If
                                    
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE_MOUSE = &HF012&
'CombineMode
Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5
'Return Val
Private Const ERROR = 0
Private Const NULLREGION = 1
Private Const SIMPLEREGION = 2
Private Const COMPLEXREGION = 3


#If Win64 Then
    Dim hDRgn As LongPtr
    Dim FHwnd As LongPtr
    Dim FRgn1 As LongPtr
    Dim FRgn2 As LongPtr
    Dim FRgn3 As LongPtr
    Dim FRgn4 As LongPtr
#Else
    Dim hDRgn As Long
    Dim FHwnd As Long
    Dim FRgn1 As Long
    Dim FRgn2 As Long
    Dim FRgn3 As Long
    Dim FRgn4 As Long
#End If



Private Sub UserForm_Initialize()
    FRgn1 = CreateEllipticRgn(10, 40, 200, 230)
    'FRgn2 = CreateEllipticRgn(40, 70, 170, 200)
    FRgn2 = CreateEllipticRgn(100, 140, 220, 260)
    FRgn3 = CreateRectRgn(10, 40, 200, 230)
    FRgn4 = CreateRoundRectRgn(30, 30, 200, 230, 100, 100)
    CombineRgn FRgn1, FRgn1, FRgn2, RGN_XOR
    FHwnd = FindWindow(vbNullString, Me.Caption)
    SetWindowRgn FHwnd, FRgn1, 1
    SetWindowPos FHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End Sub


Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    ReleaseCapture
    SendMessage FHwnd, WM_SYSCOMMAND, SC_MOVE_MOUSE, 0
End Sub

Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If FRgn1 <> 0 Then DeleteObject FRgn1
        If FRgn2 <> 0 Then DeleteObject FRgn2
        If FRgn3 <> 0 Then DeleteObject FRgn3
        If FRgn4 <> 0 Then DeleteObject FRgn4
End Sub

CreateEllipticRgn 图解

在这里插入图片描述

CombineRgn 图解

  1. RGN_AND
    在这里插入图片描述

  2. RGN_OR
    在这里插入图片描述

  3. RGN_XOR
    在这里插入图片描述

  4. RGN_DIFF
    在这里插入图片描述

  5. RGN_COPY
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDamogu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值