网上查了半天都没有讲清楚,为什么都喜欢把Form的坐标搞成(0,0),特例是不能当通用方法来用的,随意摆放的位置才有比对学习的价值。系统地学习、测试了一下,弄明白了。
百度百科里说的窗口,实际上适用于Form/控件

目录
一.常规方法能获得的准确值
【Form】在屏幕中的位置及尺寸:(100,100,839,390)
【Form】的客户区坐标系:(0,0)-(823,351)
【控件】在客户区坐标系中的位置及尺寸:(80,40,97,46)
二.API方法能做到的什么
1.针对Form
【Form】在屏幕坐标系中的位置及尺寸:(100,100,939,490)
【Form】的客户区坐标系:(0,0,823,351)
将屏幕坐标系中的点p(0,0)转换为【Form】的客户区坐标:(-108,-131)
将【Form】的客户区坐标系中的点p(0,0)转换为屏幕坐标:(108,131)
2.针对控件
【控件】在屏幕坐标系中的位置及尺寸:(188,171,285,217)
【控件】的客户区坐标系:(0,0,97,46)
将屏幕坐标系中的点p(0,0)转换为【控件】客户区坐标:(-188,-171)
将【控件】的客户区坐标系中的点p(0,0)转换为屏幕坐标:(188,171)
相应代码如下:
Option Explicit
'获取指定窗口(Form/控件)的位置及尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
'获取窗口(Form/控件)客户区的坐标系。客户区坐标指定客户区的左上角和右下角,即(0,0)-(ScaleWidth,ScaleHeight)。
Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
'将屏幕坐标系中的点转换为客户区坐标
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
'将客户区坐标系中的点转换为屏幕坐标
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
'给RECT变量赋值
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Sub Form_Load()
Dim rec As RECT
Dim recWin1 As RECT, recCli1 As RECT, recWin2 As RECT, recCli2 As RECT, p As POINTAPI
Me.Move 100 * Screen.TwipsPerPixelX, 100 * Screen.TwipsPerPixelY
Command1.Move 80, 40
'常规方法能获得的准确值
addLog3 "常规方法能获得的准确值", ""
SetRect rec, toX(Me.Left), toY(Me.Top), toX(Me.Width), toY(Me.Height)
addLog "【Form】在屏幕中的位置及尺寸", rec
addLog

本文详细解析了如何使用API函数获取控件在Form或屏幕中的精确坐标与尺寸,包括GetWindowRect、GetClientRect等函数的应用,以及如何进行坐标转换。
最低0.47元/天 解锁文章
1665

被折叠的 条评论
为什么被折叠?



