Excel VBA 窗体之特殊形状窗体 任意形状窗体 实现代码
发布时间:2023-10-27 15:10:48
在Excel中当我们有时需要一些特殊形状的窗体,如果是几何形状组合的窗体,那么我们可以使用定制化窗体之特殊形状窗体一:几何形状组合窗体中的方法来实现。但有时我们需要显示一个文字窗口,或者显示一幅镂空图画的窗体,或者任意形状的窗体,那又怎么做呢?
制作思路:
◾你首先需要准备一张图片,在图片上画出你需要显示的图形或文字等,然后将图片上需要透明的部分设置为同一种颜色(在示例中我用的是白色)。之后在窗体初始化时载入此图片,并将窗体的PictureSizeMode属性设置为1fmPictureSizeModeStretch。
◾然后在窗体初始化时用FindWindow取得窗体的句柄,再用GetWindowLong取得窗体的样式位和拓展样式位。用SetWindowLong设置窗体新的样式位和拓展样式位(无标题栏和边框)。以达到去除窗体标题栏和边框的效果。
◾接下来最重要的部分就是使我们不需要的那部分窗体透明。这里我们将用到一个API函数SetLayeredWindowAttributes。我们将函数中的参数crKey设为你需要透明部分的颜色。参数bAlpha设为0~255之间的任意值(这里将忽略此参数)。参数dwFlags设为LWA_COLORKEY,以达到使窗体镂空显示的效果。
附件下载:
操作如下:
◾在Excel的VBE窗口中插入一个用户窗体,将其命名为EspecialForm。然后再添加一个模块。在窗体和模块中添加后面所列代码。
◾在工作薄中的任意工作表中添加一窗体按钮控件,将指定其设置宏为ShowForm。其供示范之用
具体代码:
"mdArbitrary"模块代码
'---工作表按钮调用---
Sub ShowForm()
ArbitraryForm.Show 0
End Sub
"ArbitraryForm" 窗体代码
'****************************************
'---此模块创建了一个可以是任意形状的窗口---
'****************************************
Option Explicit
'以下声明API函数
#If Win64 Then '64位
'设置窗体透明度或透明样式
Private Declare PtrSafe Function SetLayeredWindowAttributes _
Lib "user32" ( _
ByVal Hwnd As LongPtr, _
ByVal crKey As Long, _
ByVal bAlpha As Byte, _
ByVal dwFlags As Long) _
As LongPtr
'取得窗体样式位
Private Declare PtrSafe Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long) _
As LongPtr
'查找窗口
Private Declare PtrSafe Function FindWindow _
Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As LongPtr
'设置窗体样式位
Private Declare PtrSafe Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) _
As LongPtr
'绘制窗体标题栏
Private Declare PtrSafe Function DrawMenuBar _
Lib "user32" ( _
ByVal Hwnd As LongPtr) _
As Long
'视情况向和窗体发送消息
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 ReleaseCapture _
Lib "user32" () _
As Long
#Else
'设置窗体透明度或透明样式
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 Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex 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 SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) _
As Long
'绘制窗体标题栏
Private Declare Function DrawMenuBar _
Lib "user32" ( _
ByVal hwnd As Long) _
As Long
'视情况向窗体发送消息
Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) _
As Long
'释放鼠标控制
Private Declare Function ReleaseCapture _
Lib "user32" () _
As Long
#End If
#If Win64 Then '64位
Private hWndForm As LongPtr
Private FIstype As LongPtr
#Else
Private hWndForm As Long
Private FIstype As Long
#End If
'以下定义常数和变量
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20) '拓展窗口样式
Private Const LWA_COLORKEY = &H1
Private Const GWL_STYLE = (-16) '窗口样式
Private Const WS_CAPTION = &HC00000
Private Const WS_EX_DLGMODALFRAME = &H1&
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE_MOUSE = &HF012&
'---窗体双击---
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Unload Me
End Sub
'---窗体初始化---
Private Sub UserForm_Initialize()
On Error Resume Next
'设置窗体背景图片, 这里为了方便我使用的是工作表中图片控件储存的图片,可以用下面第三行的语句载入自己准备好的图片
Me.Picture = ThisWorkbook.Worksheets("源图").Image1.Picture
'设置窗体背景图片时也可以用以下语句载入图片
'Me.Picture = LoadPicture(ThisWorkbook.Path & "创作.bmp")
If Err <> 0 Then
MsgBox "窗体背景图片未找到,请将压缩包内图片和此文档放置在同一目录下", vbCritical, "错误"
End
End If
'设置窗体尺寸模式
Me.PictureSizeMode = fmPictureSizeModeStretch
'查找窗体句柄
hWndForm = FindWindow("ThunderDFrame", Me.Caption)
'取得窗体样式
FIstype = GetWindowLong(hWndForm, GWL_STYLE)
'窗体样式:原样式无标题
FIstype = FIstype And Not WS_CAPTION
'重设窗体样式
SetWindowLong hWndForm, GWL_STYLE, FIstype
'取得窗体拓展样式
FIstype = GetWindowLong(hWndForm, GWL_EXSTYLE)
'窗体拓展样式:无边框,分层
FIstype = FIstype And Not WS_EX_DLGMODALFRAME Or WS_EX_LAYERED
'重设窗体拓展样式位
SetWindowLong hWndForm, GWL_EXSTYLE, FIstype
'重绘窗体标题栏
DrawMenuBar hWndForm
'设置窗体背景白色部分为透明,这里的RGB色设成你希望透明的颜色
SetLayeredWindowAttributes hWndForm, RGB(255, 255, 255), 255, LWA_COLORKEY
End Sub
'---鼠标按下---
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
'释放控制
ReleaseCapture
'向窗体发送消息
SendMessage hWndForm, WM_SYSCOMMAND, SC_MOVE_MOUSE, 0
End Sub
Excel VBA 窗体之特殊形状窗体 任意形状窗体 实现代码的下载地址:


猜你喜欢
- 由于工作或是个人需要,有些小伙伴会将自己的电脑安装两个系统,等工作完成后,想要删除其中一个系统却不知道具体该如何操作。小编下面就给大家演示一
- 很多人都很喜欢在网上下载一段文字,在WPS或者是Word中进行文字编辑。但是刚复制过来的文档,很多都是乱七八糟的,有些还空行特别多,造成文本
- 我们在制作Excel表格时,为了突出某些数值的重要性,会选择不同的背景颜色填充单元格。那么,在这种情况下呢,我们怎么才能对同一背景色的数据进
- 今天微软宣布将向Win10技术预览版Build 10041推送另一项修复型更新,其功能为消除一项导致部分用户无法登陆系统的Bug。Windo
- word是我们常用的办公软件,在工作中我们用word打字或写文章时,会出来很多页,有时为了需要只想用一页纸打印出来,那么word中怎样将多页
- 意外发现Windows原先单调乏味的锁定登录界面可以自行更换壁纸,只需要略作修改当前的桌面壁纸就可以成为锁定界面的壁纸,感兴趣的朋友可以参考
- 抖音是现在很多用户都在玩的一款短视频应用,最近有很多小伙伴都很好奇抖音是不是能够支持90赫兹让画面更加流畅呢?想要知道答案的用户,就跟小编一
- 很多朋友不清楚Mac怎么修改复制黏贴快捷键?下面小编给大家带来Mac修改复制黏贴快捷键的方法,需要的朋友可以参考下苹果电脑和市场上最多的Wi
- Excel * 能最强大的一点就是集成了大量的函数,从而极大的方便了我们对数据的处理。面对如此大量的函数,我们该如何找到想要的函数,以及如何使
- 你知道在wps怎样设置文字对齐方式 吗?其实方法很简单,不懂的朋友会请多多学习哦,下面就让小编告诉你wps设置文字对齐方式的方法,欢迎大家来
- 在Excel高级筛选中,可以将公式的计算结果作为条件使用。使用公式结果作为条件进行高级筛选时必须注意的是,要将条件标题保留为空,或者使用与数
- 昨天,有消息称Intel将首次在桌面版i5处理器中带来超线程功能,推出i5-7640K处理器,以此来抗衡AMD Ryzen大军压境。不过,进
- 今天微软发布了Win10预览版11099多国语言包官方下载,脚本之家的小编整理了简繁中文、英美英语、日语、韩语、德语、俄语等语言的下载地址并
- 最右APP怎么开直播?我们在最右中不仅可以观看一些搞笑段子、搞笑视频等,还可以开直播拉人气,那么我们要怎么在最右APP中开直播呢,下面就给大
- Word可以用来编辑文档,很多用户都非常需要,不过用户经常会遇见各种各样的问题,比如:Word文字下面有红色波浪线怎么去掉?方法很简单,小编
- 有道云笔记登录提示网络错误怎么办?有些用户在登录有道云笔记的时候,会提升网络错误,登录不了,这是怎么回事呢?该怎么解决这个问题呢?下面就给大
- 更新升级win11的用户会发现excel界面相比之前的版本做了精简和优化,更加简约大方,但是很多朋友跟小编反应自己在使用excel时不知道怎
- 你知道怎么使用wps演示去制作幻灯片文件吗?下面小编就为你介绍wps演示怎么制作幻灯片的方法啦!wps演示制作幻灯片的方法:1.首先,在电脑
- 我们在定义名称、数据有效性等等编辑框,进行excel引用位置时,如何正确使用光标移动?在名称对话框的“excel引用位置”编辑框中,直接使用
- 我们在使用win10操作系统的时候,有时为了节省系统的内存,可以尝试将一些不重要的、不常用的系统服务给设置禁用。那么现在小编就来告诉你哪些服