如何通过WinApi获取客户端窗口在屏幕上的坐标位置?
解决客户区屏幕坐标获取问题
这问题我太熟悉了!你说得没错,GetClientRect()确实只能返回客户区相对于自身左上角的坐标(所以left和top永远是0),而GetWindowRect()是整个窗口的屏幕坐标,包含标题栏、边框这些额外区域。要拿到客户区在屏幕上的真实位置,只需要把客户区的相对坐标转换成屏幕坐标就行,用ClientToScreen()函数就能轻松搞定。
具体步骤和代码示例如下:
先用你已经熟悉的
GetClientRect()获取客户区的尺寸信息:RECT clientRect; GetClientRect(handle, &clientRect);这里
clientRect.right - clientRect.left是客户区宽度,clientRect.bottom - clientRect.top是高度。定义一个
POINT结构体,指向客户区的左上角(也就是相对坐标(0,0)):POINT clientOrigin = { clientRect.left, clientRect.top };调用
ClientToScreen()把这个相对坐标转换成屏幕坐标:ClientToScreen(handle, &clientOrigin);现在
clientOrigin.x和clientOrigin.y就是客户区左上角在屏幕上的绝对坐标了!如果需要完整的客户区屏幕范围RECT,可以基于这个转换后的点和客户区尺寸计算:
RECT clientScreenRect; clientScreenRect.left = clientOrigin.x; clientScreenRect.top = clientOrigin.y; clientScreenRect.right = clientOrigin.x + (clientRect.right - clientRect.left); clientScreenRect.bottom = clientOrigin.y + (clientRect.bottom - clientRect.top);
简单说,ClientToScreen()的作用就是帮你把窗口客户区内部的相对坐标映射到全局屏幕坐标系下,完美解决你要的需求。
内容的提问来源于stack exchange,提问作者Michael Smith
相关产品推荐
相关产品推荐

