ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: prome3

[原创] 窗体控件在屏幕上的精确位置,可用于实现窗体跟随

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-2 16:08 | 显示全部楼层
高手,谢谢分享

TA的精华主题

TA的得分主题

发表于 2024-6-2 16:28 | 显示全部楼层
image.png
image.png
加了一个pixel转point的函数,能实现在窗体中定位控件右侧了

TA的精华主题

TA的得分主题

发表于 2024-6-2 16:46 | 显示全部楼层
image.png

再加一个,计算屏幕大小,根据是否出界,重新调整窗体位置。

大概意思懂了,再把一堆功能集合在一起,把可能存在的情况都做个判断,基本就能实现窗体中跟随控件了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-2 17:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 prome3 于 2024-6-3 06:17 编辑
micch 发表于 2024-6-2 15:58
现在理解下来:用这个函数可以获取控件在屏幕的像素位置,然后知道了像素坐标点,那么想把窗体显示在这个坐 ...

现在理解下来:用这个函数可以获取控件在屏幕的像素位置,然后知道了像素坐标点,那么想把窗体显示在这个坐标位置,只需要把这个RECT的值,转化为点坐标,赋值给窗体的属性,就能想放哪放哪?

我这样理解的对吗?



如果是直接用,就不需要转化为点坐标。
RECT的值是像素,如果有窗口句柄 hwnd,可以直接用 MoveWindow 函数或者 SetWindowPos 函数直接把窗体移动到指定位置:
  1. MoveWindow hwnd, RECT.Left, RECT.Top
复制代码
论坛上有很多代码会把窗体的标题去掉、或者加入最大化、最小化按钮,或者去掉右上角关闭按钮之类的,这个过程中其实已经获得了窗口句柄,要进一步完成窗体跟随的话直接用这个句柄就行了。

如果我给的代码是直接给到点坐标,那上面提到的代码里面要用的话就相当于,【获取控件像素坐标】->【转换为点坐标】->【转换为像素坐标】->【SetWindowPos hwnd】。看出问题来了没有?楼上我给的买牛肉的比喻,如果我给的是熟牛肉,那会自己处理/煮牛肉的人,拿回家还需要先把熟牛肉变回生牛肉,再按照自己的口味喜好去处理。


  1. <div class="quote"><blockquote>主要是没看懂,并不是挑毛病
复制代码
我知道您不是在挑毛病,我也不怕别人挑毛病。因为此帖给的内容很简单,没有毛病可挑。别人可能会提的问题其实我都想过了,甚至别人可能没考虑到的地方我也都考虑了。如果是像我的那个日历主题帖,内容繁多,功能复杂,在编代码的时候因为个人精力有限无法面面俱到,那我心里还是有点虚的。

这个帖子,一点不虚。

TA的精华主题

TA的得分主题

发表于 2024-6-3 15:57 | 显示全部楼层
不错的话题,留个记号!

TA的精华主题

TA的得分主题

发表于 2024-6-3 22:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-3 23:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-4 14:24 | 显示全部楼层
本帖最后由 大灰狼1976 于 2024-6-4 14:45 编辑

不用API也可以,将userform.height设为0,然后获取userform.height,在我的电脑上是29.25,向上取整得30,30*0.75(磅转换像素)=22.5,再向上取整得23,标题栏高度为23,后面简单了。

像素级定位.zip

15.19 KB, 下载次数: 18

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-4 15:28 | 显示全部楼层
@micch

前辈若真看懂了此帖的作用,可否替我给大伙说说18楼代码的问题所在?

TA的精华主题

TA的得分主题

发表于 2024-6-4 16:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 micch 于 2024-6-4 16:15 编辑

18楼文件简单看了一眼,控件如果parent是别的控件而不是窗体自身的话,定位就需要另外写代码计算。适用于基础的情况,控件直接在窗体内添加。

GetControlRect 这个函数,通过IAccessible接口的方法获取控件位置,像素坐标。然后用api转化为屏幕坐标。然后可以用api函数移动窗体到控件的相对位置,或者转化为点坐标,直接设置窗体的top,left。

到目前为止,搞懂这些,基本能用于窗体显示跟随控件了。其他细节就都是后续自己完善的事了。告一段落,那个接口和api就不研究了,知道能这么用就够了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 07:35 , Processed in 0.037097 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表