VB里怎样使用GetWindowRect、GetClientRect、ScreenToClient、ClientToScreen

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

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

百度百科里说的窗口,实际上适用于Form/控件

目录

一.常规方法能获得的准确值

二.API方法能做到的什么

1.针对Form

2.针对控件

三.常见API应用举例

1.怎样获取任一控件的尺寸,及在其容器对象中的坐标

(1)入门思路

(2)归纳为一条标准化的套路

(3)再精进一步

2.待续...

四.关于API函数MoveWindow()


一.常规方法能获得的准确值

【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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThorpeTao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值