ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4137|回复: 7

[求助] 如果取得窗体里文本框的屏幕位置

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-19 00:08 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 exaction 于 2017-5-19 00:13 编辑

最近做了一个用户窗体,功能是在日历窗体选择日期,然后赋值给窗体里的文本框。设计基本达到了预想的效果。但是一个问题没有解决好,就是弹出的日历窗体没有跟在文本框的下边。见图1 截图_1.png ,想要的效果见图2 截图_2.png 。具体的问题描述见VBE里的代码,哪位老师帮忙修改一下代码,使得达到图2的效果,在此先谢过了。
MyCalendar.rar (24.92 KB, 下载次数: 171)

TA的精华主题

TA的得分主题

发表于 2017-5-19 08:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
需要算出文本框2的application的屏幕位置才能定位

TA的精华主题

TA的得分主题

发表于 2017-5-19 08:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-5-19 14:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA中的文框控件是没有句柄的,因此用apiFocus获取到的其实是文本框父级对象(如窗体、Frame等有句柄的对象)的句柄,这样一来,日历窗体对齐的其实是窗体的左下角。
要对齐到文本框,可以用下面的代码(注意:没考虑多层嵌套的情况,例如:窗体->Frame->文本框):
  1. Option Explicit

  2. Public gtxtDateInput As MSForms.TextBox     '接受输入日期的文本框
  3. Public sDate     '选择的日期
  4. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


  5. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  6. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long

  7. Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
  8. Private Const SM_CYCAPTION = 4
  9. Private Const SM_CXDLGFRAME = 7
  10. Private Const SM_CXFRAME = 32

  11. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
  12. Private Const LOGPIXELSX = 88        '  Logical pixels/inch in X

  13. '===============================================================================================
  14. '-函数名称:    CalendarFor
  15. '-功能描述:    打开日历窗体,选择相应的日期并赋值给指定文本框
  16. '-输入参数:    DateInputCtl    必需的,要赋值的日期文本框对象
  17. '-返回参数:    返回从日历窗口中选择的日期
  18. '-其它说明:
  19. '-使用注意:    此函数必须和日历窗体MyCalendar一起配合使用
  20. '-返回参数:    无
  21. '-使用示例:    CalendarFor Me.txtTextBox
  22. '-相关调用:
  23. '-创建日期:    2017-5-18
  24. '===============================================================================================
  25. Public Function CalendarFor(DateInputCtl As MSForms.TextBox)

  26.     Set gtxtDateInput = DateInputCtl
  27.     Dim hDC As Long, res As Long, borderWidth As Long, captionHeight As Long
  28.     Dim lStyle As Long
  29.    
  30.    
  31.     '获取屏幕DPI(屏幕分辨率,即每英寸像素数)--因为windows API的长度单位是像素,而VBA的长度单位是磅(1磅=1/72英寸),所以需要先获取DPI以便单位转换
  32.     hDC = GetDC(0)
  33.     res = GetDeviceCaps(hDC, LOGPIXELSX)
  34.     ReleaseDC 0, hDC

  35.     '获取窗体边框宽度
  36.     borderWidth = GetSystemMetrics(SM_CXFRAME)
  37.    
  38.     '获取窗体标题栏高度
  39.     captionHeight = GetSystemMetrics(SM_CYCAPTION)


  40.     With MyCalendar
  41.         '让日历窗体的左边距等于窗口的左边距 + 文本控件的左边距
  42.         .Left = DateInputCtl.Parent.Left + DateInputCtl.Left + borderWidth * 72 / res
  43.         
  44.         '让日历窗体的上边路等于窗口的上边距 + 文本控件的上边距 + 文本控件的高度
  45.         '(注:在Aero主题下,可能窗体边框会宽出来一块,盖住文本框下方几个像素)
  46.         .Top = DateInputCtl.Parent.Top + DateInputCtl.Top + DateInputCtl.Height + (borderWidth + captionHeight) * 72 / res
  47.         .Show
  48.     End With
  49. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-19 17:11 | 显示全部楼层
huang1314wei 发表于 2017-5-19 08:25
excel自带日历控件的

Excel自带的日历控件,在64位操作系统是不能使用的,代码会报错

TA的精华主题

TA的得分主题

发表于 2017-5-19 17:19 | 显示全部楼层
exaction 发表于 2017-5-19 17:11
Excel自带的日历控件,在64位操作系统是不能使用的,代码会报错

可以用的,我的电脑就是64位的win10,日历控件注册一下就可以用了  
跟你操作系统没有关系,而是跟你使用的office 是32位还是64位有关,建议安装32位的office,这样大部分控件都可以用的  

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-19 23:38 | 显示全部楼层
小fisher 发表于 2017-5-19 14:08
VBA中的文框控件是没有句柄的,因此用apiFocus获取到的其实是文本框父级对象(如窗体、Frame等有句柄的对象 ...

谢谢小fisher哥的热心解答,完美解决位置对齐的问题。

TA的精华主题

TA的得分主题

发表于 2019-4-17 12:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢分享。

TA的精华主题

TA的得分主题

发表于 2021-4-22 01:25 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
huang1314wei 发表于 2017-5-19 17:19
可以用的,我的电脑就是64位的win10,日历控件注册一下就可以用了  
跟你操作系统没有关系,而是跟你使用 ...

怎么注册?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 22:53 , Processed in 0.034420 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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