vb 获取某窗口内相对坐标
打开某个程序,有些程序上面有标题和边框,有些程序没有标题和边框(例如全屏游戏那类),鼠标移动到那程序上面时,怎样获取当前鼠标在那程序的相对坐标?网上搜索了下,很多都是包括...
打开某个程序,有些程序上面有标题和边框,有些程序没有标题和边框(例如全屏游戏那类),
鼠标移动到那程序上面时,怎样获取当前鼠标在那程序的相对坐标?
网上搜索了下,很多都是包括标题和边框的相对坐标。
如何在label中分别显示
包括标题和边框时的相对坐标
和
没有标题和边框的相对坐标
代码怎样写? 展开
鼠标移动到那程序上面时,怎样获取当前鼠标在那程序的相对坐标?
网上搜索了下,很多都是包括标题和边框的相对坐标。
如何在label中分别显示
包括标题和边框时的相对坐标
和
没有标题和边框的相对坐标
代码怎样写? 展开
4个回答
展开全部
仅提供解决思路。不提供代码,API请自己找齐。
这样以后你遇到类似问题可以自行解决。
以下为思路,看不懂请自己琢磨相关逻辑和API作用。
1.GetCursorPos 获取鼠标坐标 设获得的坐标为t_pos
2.WindowFromPoint 获取t_pos坐标指向的窗体 设获得的窗体句柄为hwnd
3.GetWindowRect 根据hwnd获取对应窗体坐标。此时t_pos与窗体坐标相减可以初步计算得相对坐标(包括标题栏等),设此时计算得坐标为pos
4.GetWindowLong 获取样式,判断是否存在WS_BORDER(是否有边框)
方法:
假设GetWindowLong,获取的样式保存在style中,则if style or WS_BORDER=style then 存在WS_BORDER else 不存在WS_BORDER
如果存在WS_BORDER即有边框,则再调用GetSystemMetrics得到边框和标题栏宽度高度,然后pos与之相减(减掉边框)得到坐标相对于客户区的坐标
如果不存在WS_BORDER,则pos直接就是相对于客户区的坐标(无边框)
这样以后你遇到类似问题可以自行解决。
以下为思路,看不懂请自己琢磨相关逻辑和API作用。
1.GetCursorPos 获取鼠标坐标 设获得的坐标为t_pos
2.WindowFromPoint 获取t_pos坐标指向的窗体 设获得的窗体句柄为hwnd
3.GetWindowRect 根据hwnd获取对应窗体坐标。此时t_pos与窗体坐标相减可以初步计算得相对坐标(包括标题栏等),设此时计算得坐标为pos
4.GetWindowLong 获取样式,判断是否存在WS_BORDER(是否有边框)
方法:
假设GetWindowLong,获取的样式保存在style中,则if style or WS_BORDER=style then 存在WS_BORDER else 不存在WS_BORDER
如果存在WS_BORDER即有边框,则再调用GetSystemMetrics得到边框和标题栏宽度高度,然后pos与之相减(减掉边框)得到坐标相对于客户区的坐标
如果不存在WS_BORDER,则pos直接就是相对于客户区的坐标(无边框)
展开全部
borderstyle属性可以改变窗体边框和标题:
0-无边框
1-含控制菜单、标题栏、最大化和最小化按钮,窗体大小不能拖动改变。
2-默认,窗体可以随意拖动改变大小。
3-固定大小,有控制菜单和标题栏,但没有最大化、最小化按钮。
4-固定大小,只有关闭按钮,并用缩小字体显示标题栏。
5-可变大小,只有关闭按钮,并用缩小字体显示标题栏。
在窗体的mousemove事件中x、y分别代表鼠标在窗体中的x、y坐标值。
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
label=x","y
End Sub
如果你想要加上标题栏那部分,那就在y上加上标题栏的宽度就可以了。
0-无边框
1-含控制菜单、标题栏、最大化和最小化按钮,窗体大小不能拖动改变。
2-默认,窗体可以随意拖动改变大小。
3-固定大小,有控制菜单和标题栏,但没有最大化、最小化按钮。
4-固定大小,只有关闭按钮,并用缩小字体显示标题栏。
5-可变大小,只有关闭按钮,并用缩小字体显示标题栏。
在窗体的mousemove事件中x、y分别代表鼠标在窗体中的x、y坐标值。
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
label=x","y
End Sub
如果你想要加上标题栏那部分,那就在y上加上标题栏的宽度就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
窗体中加入一个Timer,代码如下:
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type
Private Sub Form_Load()
Timer1.Interval = 15
End Sub
Private Sub Timer1_Timer()
Dim pt As POINTAPI
Dim wfp As WINDOWPLACEMENT
Dim myhwnd As Long
Dim r As Long
GetCursorPos pt
myhwnd = WindowFromPoint(pt.x, pt.y)
r = GetWindowPlacement(myhwnd, wfp)
Cls
Print "Current hWnd:" & myhwnd
Print "X:" & pt.x - wfp.rcNormalPosition.Left
Print "Y:" & pt.y - wfp.rcNormalPosition.Top
End Sub
该代码可以得到鼠标在所指的窗体中的相对坐标
上面的myhwnd为窗体句柄。
当然除了WindowFromPoint函数,你也可以使用getwindowlong或者getforegruondwindow等函数获得窗体句柄。
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type
Private Sub Form_Load()
Timer1.Interval = 15
End Sub
Private Sub Timer1_Timer()
Dim pt As POINTAPI
Dim wfp As WINDOWPLACEMENT
Dim myhwnd As Long
Dim r As Long
GetCursorPos pt
myhwnd = WindowFromPoint(pt.x, pt.y)
r = GetWindowPlacement(myhwnd, wfp)
Cls
Print "Current hWnd:" & myhwnd
Print "X:" & pt.x - wfp.rcNormalPosition.Left
Print "Y:" & pt.y - wfp.rcNormalPosition.Top
End Sub
该代码可以得到鼠标在所指的窗体中的相对坐标
上面的myhwnd为窗体句柄。
当然除了WindowFromPoint函数,你也可以使用getwindowlong或者getforegruondwindow等函数获得窗体句柄。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实得到窗体的句柄就什么都得到了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询