Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >创建可调大小的用户窗体——使用Windows API

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

作者头像
fanjy
发布于 2023-08-29 13:11:50
发布于 2023-08-29 13:11:50
79802
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:2
代码可运行

标签:VBA,Windows API

在使用VBA创建用户窗体时,通常会将其设置为特定的大小。然而,通过一些编码技巧,可以为其实现类似的调整大小效果。

本文的代码整理自exceloffthegrid.com,供有兴趣的朋友参考。

本文代码能够实现:允许调整用户窗体的大小;调整窗体大小时用户窗体的Resize事件能捕获;每次Resize事件后,对象的大小或位置都会发生变化。

首先,在VBE中插入一个标准模块,输入下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

上面的两个代码段创建了一个可重复使用的过程,可以使用它来打开或关闭调整用户窗体大小的设置。如果想要能够调整用户窗体大小,使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Call ResizeWindowSettings(myUserForm, True)

关闭调整用户窗体大小,使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Call ResizeWindowSettings(myUserForm, False)

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

示例

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

图1

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

当该用户窗体调整大小时,这两个元素都应该作出相应更改。lstListBox的大小应更改,但位置不应更改,而cmdClose的位置将更改,但大小不应更改。为此,需要从该用户窗体的底部和右侧了解这些对象的位置。如果与底部和右侧保持相同的距离,则这些元素似乎与该用户窗体同步移动。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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所示。

图2

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel实战技巧58: 使用VBA创建进度条
2.设置其ShowModal属性为False,这样在该用户窗体处于打开状态时仍能继续运行程序。
fanjy
2019/11/07
6.8K0
Excel实战技巧58: 使用VBA创建进度条
Excel用户窗体中添加最小化按钮及窗体最小化的代码实现
文章背景:用户窗体是Excel中的UserForm对象。在使用UserForm时,曾经目前遇到过两个问题。
Exploring
2022/08/10
2.9K0
Excel用户窗体中添加最小化按钮及窗体最小化的代码实现
VB实现半透明或者部分透明窗体
        Windows2000已经出了n年多了,就先介绍一下Windows2000特有的API吧!! AnimateWindow是一个窗口打开和关闭时产生动画效果的新函数,因为是一个新的函数, 所以在 API Viewer中是找不到的,必需自己定义:    Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha
用户1075292
2018/01/23
1.7K0
VB实现半透明或者部分透明窗体
设置窗体透明 隐藏任务栏 与全屏显示
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//TopMost
全栈程序员站长
2022/07/04
1.6K0
VBA 窗体增加最小化按钮
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long '获取窗口样式
办公魔盒
2019/07/22
1.7K0
VB6源码 webbrowser 自动登录网页批量下载文件 IE下载弹窗控制
VB6源码 webbrowser 网抓 自动登录网页批量下载文件 IE下载弹窗控制,网页元素控制等!!
办公魔盒
2019/07/22
2.6K0
VBA使用API_03:创建窗体
使用Excel VBA要创建窗体非常的简单,直接插入一个用户窗体就可以了,VBA已经封装好了窗体,而且具有很多功能以及控件。
xyj
2020/07/28
2.1K0
VBA使用API_03:创建窗体
VBA创建弹出菜单
fanjy
2023/09/25
7010
VBA创建弹出菜单
创建可调大小的用户窗体——使用VBA
在上篇文章:创建可调大小的用户窗体——使用Windows API中,我们使用Windows API实现了允许用户可以调整用户窗体的大小。本文仅使用VBA来实现同样的效果。
fanjy
2023/08/29
1.5K0
创建可调大小的用户窗体——使用VBA
VB6 PDF批量打印,方便快速
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (lpExecInfo As SHELLEXECUTEINFO) As Long
办公魔盒
2019/07/22
2.4K0
显示文件和文件夹的关联图标和说明
例如,若要获取 DBF 文件的这些关联,第一步是找到“HKEY_CLASSES_ROOT.dbf”注册表项。此项的默认值为“Visual.FoxPro.Table”。这意味着“HKEY_CLASSES_ROOT\Visual.FoxPro.Table”键必须位于下一个。
加菲猫的VFP
2023/08/21
2920
显示文件和文件夹的关联图标和说明
VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法
'==========================================================
大师级码师
2022/11/06
1.1K0
VB实现的《QQ美女找茬游戏》实例分享
本文实例讲述了VB实现的《QQ美女找茬游戏》。分享给大家供大家参考。具体如下:比较无聊哈,原理很简单,用VB速度比较慢,但是实现很容易。Option ExplicitPrivate Type sPOINT  x As Long  y As LongEnd TypePrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetPixel Lib "gdi32" (ByVal
大师级码师
2022/11/06
6270
vb.net_一个半成品
Imports System.Text Imports System.Runtime.InteropServices Public Class Form1 '引用win32api进行枚举窗体句柄操作 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr Pri
landv
2018/05/24
8760
VB6对滚轮的支持
        我需要对Mapx控件支持鼠标滚轮,找了一个可以使用的代码,来自         http://blog.csdn.net/areful/archive/2007/10/19/1832010.aspx         需要注意的是,在FormLoad中增加Hook Map1.hWnd,在Form_Unload中增加UnHook Map1.hWnd         另外,在鼠标移动经过Map时,可以激发Map的mousemove事件,但滚轮无效,因为焦点不在Map上,可以用Map1.SetF
用户1075292
2018/01/23
1.1K0
VB的TextBox文本框实现垂直居中显示的方法
Form_Load()窗体代码中的多行属性设置必须为真,即Text1.MultiLine = True,该属性为只读属性,请在设计时修改,换行会被之后的代码屏蔽,不想屏蔽可自行修改,调用此函数就好了。
大师级码师
2022/11/06
3.3K0
VBA代码:处理剪贴板
在VBE中,插入一个类模块,并将其重命名为“ClipBoard”,输入下面的代码:
fanjy
2023/10/04
1K0
VBA代码:处理剪贴板
将用户窗体保存为PDF
在网上看到的一段程序,能够将用户窗体保存为PDF文件,特辑录于此,供查阅或方便有兴趣的朋友参考。
fanjy
2024/05/22
2620
将用户窗体保存为PDF
C/C++常用控制台函数
需要说明的是,这个头文件包含了大多数win api函数的定义,绝不仅仅只包含控制台api
CtrlX
2022/09/27
1.4K0
C/C++常用控制台函数
C#窗口句柄
在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多 Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
全栈程序员站长
2022/09/14
6840
相关推荐
Excel实战技巧58: 使用VBA创建进度条
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档