让对话框窗口限制在最大和最小尺寸之间
目录1. 效果演示2. 功能介绍3. 实现过程4. 完整源码5. 相关合集1. 效果演示2. 功能介绍按住鼠标左键拖动边框在最大和最小尺寸之间调整窗口大小。3. 实现过程之前发布过一篇这样的文章让对话框窗口支持边框大小调整让对话框窗口支持边框大小调整让对话框窗口支持边框大小调整用户可以使用鼠标左键任意调整窗口大小。今天我们再对它进行一个功能拓展让对话框窗口尺寸永远限制在设定好的最大和最小尺寸之间。这对于VBA列表视图Listview等控件非常友好可以有效避免窗口尺寸过小导致数据显示不完整的情况发生。灵感晚间在搜索Windows通知时偶然发现了WM_GETMINMAXINFO通知简介描述的非常有趣当窗口的大小或位置即将更改时发送到窗口。 应用程序可以使用此消息来替代窗口的默认最大大小和位置或者其默认的最小或最大跟踪大小。这意味着我们可以在窗口大小调整时进行手动限制。于是你现在看的这篇文章诞生了。如何使用WM_GETMINMAXINFO通知要知道子类化窗口过程一共有四个参数分别是hwnd、Msg、wParam和lParam。窗口过程在每次接收到一个通知时也会接收到这四个参数的信息。其中wParam和lParam参数因通知而异比如在接收到WM_GETMINMAXINFO通知时lParam参数包含了专属结构MINMAXINFO的全部信息而wParam参数却没有用到。3.1. 声明该通知的专属结构MINMAXINFOPrivate Type POINTAPI x As Long y As Long End Type Private Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type3.2. 使用RtlMoveMemory函数从内存中复制出专属结构的信息获取专属结构信息 Dim mmmm As MINMAXINFO RtlMoveMemory mmmm, ByVal lParam, LenB(mmmm)3.3. 修改结构中所需的成员值这里修改了结构成员ptMinTrackSize最小跟踪尺寸和ptMaxTrackSize最大跟踪尺寸值也就是在调整窗口大小时限制的最小尺寸和最大尺寸。指定窗口最小尺寸 mmmm.ptMinTrackSize.x 200 mmmm.ptMinTrackSize.y 150 指定窗口最大尺寸 mmmm.ptMaxTrackSize.x 320 mmmm.ptMaxTrackSize.y 2403.4. 调用RtlMoveMemory函数将修改后的结构信息复制回内存中更改内存中的结构信息 RtlMoveMemory ByVal lParam, mmmm, LenB(mmmm)3.5. 添加返回值防止系统默认处理用户已处理 WindowProcfrmMain Nuptr Exit Function4. 完整源码建议大家在了解实现原理之后亲自动手编写代码实操这样才能提升自身能力。• 代码适配32与64位系统• 代码不区分WPS或EXCEL VBA环境你只需要复制代码到一个新模块中就能运行晚间有雨伴人眠202608011619 原创代码转载或二创请标明来源 #If VBA7 And Win64 Then Private Declare PtrSafe Function IsWindow Lib user32 (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function ShowWindow Lib user32 (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long Private Declare PtrSafe Function FindWindowA Lib user32 (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function CreateWindowExA Lib user32 (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal HwndParent As LongPtr, ByVal hMenu As LongPtr, ByVal Hinstance As LongPtr, lpParam As Any) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib user32 Alias SetWindowLongPtrA (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function SetFocus Lib user32 (ByVal hwnd As LongPtr) As LongPtr Private Declare PtrSafe Function CallWindowProcA Lib user32 (ByVal lpPrevWndFunc As LongPtr, ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr Private Declare PtrSafe Function DestroyWindow Lib user32 (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function GetWindowLongA Lib user32 Alias GetWindowLongPtrA (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Sub RtlMoveMemory Lib kernel32 (Destination As Any, Source As Any, ByVal Length As LongPtr) #Else Private Declare Function IsWindow Lib user32 (ByVal hwnd As Long) As Long Private Declare Function ShowWindow Lib user32 (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Private Declare Function FindWindowA Lib user32 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function CreateWindowExA Lib user32 (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal HwndParent As Long, ByVal hMenu As Long, ByVal Hinstance As Long, lpParam As Any) As Long Private Declare Function SetWindowLongA Lib user32 (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetFocus Lib user32 (ByVal hwnd As Long) As Long Private Declare Function CallWindowProcA Lib user32 (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function DestroyWindow Lib user32 (ByVal hwnd As Long) As Long Private Declare Function GetWindowLongA Lib user32 Alias GetWindowLongPtrA (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Sub RtlMoveMemory Lib kernel32 (Destination As Any, Source As Any, ByVal Length As Long) #End If #If VBA7 And Win64 Then Private Type POINTAPI x As Long y As Long End Type Private Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type #Else Private Type POINTAPI x As Long y As Long End Type Private Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type #End If #If VBA7 And Win64 Then Private Const Nuptr As LongPtr 0 Private Ud As UserDialogType Private Type UserDialogType Dialog As LongPtr DialogProc As LongPtr Editor As LongPtr EditorState As LongPtr End Type #Else Private Const Nuptr As Long 0 Private Ud As UserDialogType Private Type UserDialogType Dialog As Long DialogProc As Long Editor As Long EditorState As Long End Type #End If Private Const SW_SHOW 5 Private Const SW_HIDE 0 Private Const WS_VISIBLE H10000000 Private Const WS_POPUP H80000000 Private Const WS_SYSMENU H80000 Private Const WS_CAPTION HC00000 Private Const WS_EX_DLGMODALFRAME H1 Private Const GWL_WNDPROC -4 Private Const WM_CLOSE H10 Private Const WM_DESTROY H2 Private Const GWL_STYLE -16 Private Const WS_THICKFRAME H40000 Private Const WM_GETMINMAXINFO H24 Public Sub CreateUserDialog() 对话框窗口若已存在则直接显示 If IsWindow(Ud.Dialog) Then ShowWindow Ud.Dialog, SW_SHOW: Exit Sub 获取编辑器句柄并隐藏 Ud.Editor FindWindowA(wndclass_desked_gsk, vbNullString) Ud.EditorState ShowWindow(Ud.Editor, SW_HIDE) 指定对话框初始样式 Dim StyleS: StyleS WS_VISIBLE Or WS_POPUP Or WS_SYSMENU Or WS_CAPTION Dim StyleE: StyleE WS_EX_DLGMODALFRAME 创建对话框主窗口 Ud.Dialog CreateWindowExA(StyleE, #32770, UserDialog, StyleS, 15, 50, 300, 200, Nuptr, Nuptr, Nuptr, Nuptr) 添加窗口样式 SetWindowLongA Ud.Dialog, GWL_STYLE, GetWindowLongA(Ud.Dialog, GWL_STYLE) Or WS_THICKFRAME 设置对话框子类化 Ud.DialogProc SetWindowLongA(Ud.Dialog, GWL_WNDPROC, AddressOf WindowProcUdDialog) 设置焦点 SetFocus Ud.Dialog End Sub #If VBA7 And Win64 Then Private Function WindowProcUdDialog(ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr #Else Private Function WindowProcUdDialog(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long #End If Select Case msg 窗口即将关闭时 Case WM_CLOSE 销毁窗口 DestroyWindow Ud.Dialog 用户已处理 WindowProcUdDialog Nuptr Exit Function 窗口销毁后 Case WM_DESTROY 取消子类化 SetWindowLongA Ud.Dialog, GWL_WNDPROC, Ud.DialogProc 还原编辑器的显示状态 If Ud.EditorState Then ShowWindow Ud.Editor, SW_SHOW 清理内存 Dim EmptyUd As UserDialogType: Ud EmptyUd 用户已处理 WindowProcUdDialog Nuptr Exit Function 限制窗口的最大/最小尺寸 Case WM_GETMINMAXINFO 获取专属结构信息 Dim mmmm As MINMAXINFO RtlMoveMemory mmmm, ByVal lParam, LenB(mmmm) 指定窗口最小尺寸 mmmm.ptMinTrackSize.x 200 mmmm.ptMinTrackSize.y 150 指定窗口最大尺寸 mmmm.ptMaxTrackSize.x 320 mmmm.ptMaxTrackSize.y 240 更改内存中的结构信息 RtlMoveMemory ByVal lParam, mmmm, LenB(mmmm) 用户已处理 WindowProcUdDialog Nuptr Exit Function End Select 调用默认通知处理 WindowProcUdDialog CallWindowProcA(Ud.DialogProc, hwnd, msg, wParam, lParam) End Function5. 相关合集关于#32770对话框窗口的专项开发计划

相关新闻

最小二乘问题详解22:抗差估计与增量式SFM的工程稳健实现

最小二乘问题详解22:抗差估计与增量式SFM的工程稳健实现

最小二乘问题详解22:抗差估计与增量式SFM的工程稳健实现 大家好,欢迎来到《最小二乘问题详解》系列的第22篇。前几篇我们聊了标准最小二乘(LS)的推导、QR分解、Cholesky分解,还有非线性优化的高斯牛顿和LM算法。但今天…

2026/8/6 13:15:24 阅读更多 →
Python实现高效相似性检索:FAISS实战指南

Python实现高效相似性检索:FAISS实战指南

1. 项目概述在数据密集型应用中,相似性检索是一个常见但极具挑战性的需求。想象一下,你手头有数百万条文本、图片或商品数据,如何快速找到与目标最相似的几条记录?这就是相似性检索要解决的核心问题。Python作为数据科学领域的主流…

2026/8/6 13:15:24 阅读更多 →
2026涉密项目投标缺资质怎么补救?3类缺口的应急判断与行动清单

2026涉密项目投标缺资质怎么补救?3类缺口的应急判断与行动清单

周一上午,一家做安防工程的企业接到消息:某单位涉密安防监控项目正在招标,投标截止周五下午。负责人让投标专员赶紧准备,专员翻完招标公告的资格要求,发现一条——"供应商须具备涉密信息系统集成资质(…

2026/8/6 13:14:24 阅读更多 →

最新新闻

耦合电感电路:从互感原理到高频应用的设计与调试指南

耦合电感电路:从互感原理到高频应用的设计与调试指南

1. 项目概述:从“黑盒子”到“能量桥梁”的认知跃迁在电子电路的世界里,我们常常把电阻、电容、电感这些基础元件看作是独立的“个体户”,各自在自己的岗位上发光发热。电阻负责消耗能量,电容负责储存电场能,电感则储存…

2026/8/7 2:44:37 阅读更多 →
Java开发者必备:思维导图构建高效知识体系

Java开发者必备:思维导图构建高效知识体系

1. 为什么Java开发者需要思维导图作为一名从业十年的Java全栈工程师,我深刻体会到思维导图在技术学习中的价值。记得刚入行时面对Spring框架繁杂的模块关系,用A4纸手绘的模块结构图让我第一次看清了技术脉络。现在回看,那就是最原始的思维导图…

2026/8/7 2:44:37 阅读更多 →
复旦类脑智能研究院研究生申请:超越985/211标签,聚焦数理基础与科研潜力

复旦类脑智能研究院研究生申请:超越985/211标签,聚焦数理基础与科研潜力

1. 项目缘起:一个“生源画像”引发的深度好奇最近在整理国内顶尖高校交叉学科的研究生招生情况时,一个现象引起了我的注意:复旦大学类脑智能科学与技术研究院(以下简称“复旦类脑院”)的硕士和博士研究生生源&#xff…

2026/8/7 2:44:37 阅读更多 →
Unity桌面宠物开发:实现透明窗口与鼠标穿透的完整指南

Unity桌面宠物开发:实现透明窗口与鼠标穿透的完整指南

1. 项目概述:为什么桌面宠物需要透明与穿透? 几年前,我尝试用Unity做一个小猫的桌面宠物,兴致勃勃地打包出来,结果发现一个尴尬的问题:这个“宠物”是一个不透明的、带边框的方块窗口,不仅挡住了…

2026/8/7 2:44:37 阅读更多 →
量化交易策略回测与验证:从Python实现到绩效分析实战

量化交易策略回测与验证:从Python实现到绩效分析实战

这次我们来看一个名为“明牌验证策略”的量化交易分析项目。它不是一个新的AI模型或软件工具,而是一套公开的、基于历史数据回测和实时信号验证的股票或加密货币交易策略分析框架。核心在于“明牌”和“验证”,即策略逻辑相对透明,并通过历史…

2026/8/7 2:44:37 阅读更多 →
CSS属性深度解析:从盒模型到现代布局,掌握前端核心布局技术

CSS属性深度解析:从盒模型到现代布局,掌握前端核心布局技术

1. 项目概述:从“属性”到“掌控力” 很多刚接触前端的朋友,学到CSS的第四天,看到“CSS属性”这个标题,可能会觉得:“哦,就是一堆可以设置的样式呗,比如 color 、 font-size ,记…

2026/8/7 2:43:36 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →