0

0

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

看不見的法師

看不見的法師

发布时间:2025-08-29 09:16:20

|

483人浏览过

|

来源于php中文网

原创

在使用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所示。

乐彼多用户商城系统LBMall(.net)
乐彼多用户商城系统LBMall(.net)

乐彼多用户商城系统,采用ASP.NET分层技术和AJAX技术,运营于高速稳定的微软.NET+MSSQL 2005平台;完全具备搭建超大型网络购物多用户网上商城的整体技术框架和应用层次LBMall 秉承乐彼软件优秀品质,后台人性化设计,管理窗口识别客户端分辨率自动调整,独立配置的菜单操作锁,使管理操作简单便捷。待办事项1、新订单、支付、付款、短信提醒2、每5分钟自动读取3、新事项声音提醒 店铺管理1

下载

创建可调大小的用户窗体——使用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查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

524

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1059

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

754

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

427

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2343

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

769

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1481

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

1603

2023.08.30

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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