创建可调大小的用户窗体——使用Windows API

看不見的法師
发布: 2025-08-29 09:16:20
原创
477人浏览过

在使用vba设计用户窗体时,通常会将其设定为固定的尺寸。然而,通过编程技巧,可以实现类似于调整大小功能的效果。

本文的代码来自exceloffthegrid.com,供有兴趣的读者参考。

本文的代码可以实现以下功能:允许调整用户窗体的大小;在调整窗体大小时,用户窗体的Resize事件会被触发;每次Resize事件后,对象的大小或位置都会随之改变。

首先,在VBE中添加一个标准模块,并输入以下代码:

Public Const GWL_STYLE = -16
Public Const WS_CAPTION = &HC00000
Public Const WS_THICKFRAME = &H40000
#If VBA7 Then
  Public Declare PtrSafe Function GetWindowLong _
   Lib "user32" Alias "GetWindowLongA" ( _
   ByVal hWnd As Long, ByVal nIndex As Long) As Long
  Public Declare PtrSafe Function SetWindowLong _
   Lib "user32" Alias "SetWindowLongA" ( _
   ByVal hWnd As Long, ByVal nIndex As Long, _
   ByVal dwNewLong As Long) As Long
  Public Declare PtrSafe Function DrawMenuBar _
   Lib "user32" (ByVal hWnd As Long) As Long
  Public Declare PtrSafe Function FindWindowA _
   Lib "user32" (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
#Else
  Public Declare Function GetWindowLong _
   Lib "user32" Alias "GetWindowLongA" ( _
   ByVal hWnd As Long, ByVal nIndex As Long) As Long
  Public Declare Function SetWindowLong _
   Lib "user32" Alias "SetWindowLongA" ( _
   ByVal hWnd As Long, ByVal nIndex As Long, _
   ByVal dwNewLong As Long) As Long
  Public Declare Function DrawMenuBar _
   Lib "user32" (ByVal hWnd As Long) As Long
  Public Declare Function FindWindowA _
   Lib "user32" (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
#End If
Sub ResizeWindowSettings(frm As Object, show As Boolean)
  Dim windowStyle As Long
  Dim windowHandle As Long
  '获取Windows内存中对窗口和样式位置的引用
  windowHandle = FindWindowA(vbNullString, frm.Caption)
  windowStyle = GetWindowLong(windowHandle, GWL_STYLE)
  '确定要应用的样式
  If show = False Then
    windowStyle = windowStyle And (Not WS_THICKFRAME)
  Else
    windowStyle = windowStyle + (WS_THICKFRAME)
  End If
  '应用新样式
  SetWindowLong windowHandle, GWL_STYLE, windowStyle
  '使用新样式重新创建用户窗体窗口
  DrawMenuBar windowHandle
End Sub
登录后复制

上述代码段创建了一个可重用的过程,用于开启或关闭用户窗体的调整大小设置。如果想要启用调整用户窗体大小的功能,可以使用以下代码:

Call ResizeWindowSettings(myUserForm, True)
登录后复制

如果想要关闭调整用户窗体大小的功能,可以使用以下代码:

Call ResizeWindowSettings(myUserForm, False)
登录后复制

其中,myUserForm是需要调整大小的用户窗体的名称。

示例

在VBE中,插入一个用户窗体,如下图1所示。

易优微信工程机械小程序模板
易优微信工程机械小程序模板

易优小程序是基于前端开源小程序+后端易优cms+标签化API接口,是一套开源、快速搭建个性化需求的小程序CMS。轻量级TP底层框架,前后端分离,标签化API接口可对接所有小程序,支持二次开发。即使小白用户也能轻松搭建制作一套完整的线上版小程序。微信工程机械小程序模板主要特点:1、代码开源,支持二次修改。2、微信原生写法,兼容性更好,代码可读性更强。3、功能接口完整,支持eyoucms大部分功能ap

易优微信工程机械小程序模板 0
查看详情 易优微信工程机械小程序模板

创建可调大小的用户窗体——使用Windows API图1

可以看到,该用户窗体上包含一个名为“lstListBOx”的列表框和一个名为“cmdClose”的命令按钮。

当调整该用户窗体大小时,这两个元素应该相应地进行调整。lstListBox的大小应改变,但位置不应改变,而cmdClose的位置应改变,但大小不应改变。为此,需要从该用户窗体的底部和右侧了解这些对象的位置。如果与底部和右侧保持相同的距离,则这些元素看起来像是与该用户窗体同步移动。

在该用户窗体的代码窗口中,输入以下代码:

Private lstListBoxBottom As Double
Private lstListBoxRight As Double
Private cmdCloseBottom As Double
Private cmdCloseRight As Double
Private Sub UserForm_Initialize()
 '调用Window API启用调整大小
 Call ResizeWindowSettings(Me, True)
 '获取要调整大小的对象的右下角定位点位置
 lstListBoxBottom = Me.Height - lstListBox.Top - lstListBox.Height
 lstListBoxRight = Me.Width - lstListBox.Left - lstListBox.Width
 cmdCloseBottom = Me.Height - cmdClose.Top - cmdClose.Height
 cmdCloseRight = Me.Width - cmdClose.Left - cmdClose.Width
End Sub
Private Sub UserForm_Resize()
 On Error Resume Next
 '设置对象的新位置
 lstListBox.Height = Me.Height - lstListBoxBottom - lstListBox.Top
 lstListBox.Width = Me.Width - lstListBoxRight - lstListBox.Left
 cmdClose.Top = Me.Height - cmdCloseBottom - cmdClose.Height
 cmdClose.Left = Me.Width - cmdCloseRight - cmdClose.Width
 On Error GoTo 0
End Sub
登录后复制

运行用户窗体,效果如下图2所示。

创建可调大小的用户窗体——使用Windows API图2

欢迎在评论区留言,帮助完善本文内容,让更多人能够学习到更完善的知识。

以上就是创建可调大小的用户窗体——使用Windows API的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号