首页officeexcel正文

Excel VBA 窗体之特殊形状窗体 几何形状组合窗体 实现代码

强国说学习2023-04-20283ExcelVBA窗体特殊形状几何组合实现

在VBA中我们有时需要一些特殊形状的窗体来美化我们的程序,比如说几个几何形状的组合样式的窗体。那我们就来作一个同心圆形状的窗体: 本示例主要运用 API 函数来定制化Excel中的用户窗体,使其显示特殊形状

附件下载:

WPS之家wps.qiangguoshuo.com

点击链接从百度网盘下载

操作如下:

◾在Excel的VBE窗口中插入一个用户窗体,将其命名为EspecialForm。然后再添加一个模块。然后在窗体和模块中添加后面所列代码。

◾在工作薄中的任意工作表中添加一窗体按钮控件,将指定其设置宏为ShowForm。其供示范之用

具体代码:

"mdEspecial"模块代码

Sub btnShowEspecial_Click()frmEspecial.ShowEnd Sub

"frmEspecial" 窗体代码

Option Explicit'**********************************'---此模块主要是创建了一个圆环窗体---'**********************************'以下声明API函数#If Win64 Then '64位'视情况向和窗体发送消息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#End If'声明常数及变量Private Const WM_SYSCOMMAND = &H112Private Const SC_MOVE_MOUSE = &HF012&Private Const RGN_XOR = 3 '两个源区域并集之外的部分#If Win64 Then '64位Dim FHwnd As LongPtrDim FRgn1 As LongPtrDim FRgn2 As LongPtr#ElseDim FHwnd As LongDim FRgn1 As LongDim FRgn2 As Long#End If'窗体双击Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)Unload MeEnd Sub'窗体初始化Private Sub UserForm_Initialize()FRgn1 = CreateEllipticRgn(10, 40, 200, 230) '创建一个圆FRgn2 = CreateEllipticRgn(30, 60, 180, 210) '创建一个圆CombineRgn FRgn1, FRgn1, FRgn2, RGN_XOR '合并两个圆,取其不相交的部分FHwnd = FindWindow(vbNullString, Me.Caption) '查找窗体句柄SetWindowRgn FHwnd, FRgn1, 1 '设置窗体区域,一个圆环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, 0End Sub

如想转载该文章请注明出处:强国说学习-qiangguoshuo.com
强国说学习

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.qiangguoshuo.com/excel/73067.html