c++ 获取窗口客户区点击坐标
时间: 2023-10-18 10:24:27 浏览: 238
你可以使用Windows API中的GetCursorPos和ScreenToClient函数来获取鼠标点击在窗口客户区中的坐标。具体步骤如下:
1. 获取鼠标当前在屏幕上的坐标,使用GetCursorPos函数。该函数需要传入一个指向POINT结构体的指针,用来存储鼠标当前位置的x和y坐标。
2. 将屏幕坐标转换成客户区坐标,使用ScreenToClient函数。该函数需要传入窗口句柄和指向POINT结构体的指针,用来存储转换后的客户区坐标。
下面是一个示例代码:
```
// 获取窗口客户区点击坐标
void GetClickPos(HWND hWnd, int& x, int& y)
{
POINT pt;
GetCursorPos(&pt);
ScreenToClient(hWnd, &pt);
x = pt.x;
y = pt.y;
}
```
其中,hWnd是窗口句柄,x和y是用来存储客户区坐标的变量。调用该函数后,x和y即为鼠标点击在窗口客户区中的坐标。
相关问题
通过窗口句柄c++获取窗口坐标宽高等信息
在C++中,获取窗口的坐标、宽度和高度通常需要利用Windows API或者第三方库,如Microsoft Windows SDK提供的函数。以下是一个基本的示例,使用`GetWindowRect`函数来获取窗口的位置(左上角坐标)和尺寸:
```cpp
#include <windows.h>
#include <tchar.h>
// 函数来获取窗口信息
void GetWindowInfo(HWND hWnd, int* left, int* top, int* width, int* height) {
RECT windowRect;
if (GetWindowRect(hWnd, &windowRect)) { // 获取窗口矩形
*left = windowRect.left; // 左上角X坐标
*top = windowRect.top; // 左上角Y坐标
*width = windowRect.right - windowRect.left; // 宽度
*height = windowRect.bottom - windowRect.top; // 高度
}
}
int main() {
HWND hWnd = FindWindow(NULL, L"Your Window Title"); // 找到目标窗口,替换为实际标题
if (hWnd != NULL) {
int left, top, width, height;
GetWindowInfo(hWnd, &left, &top, &width, &height);
_tprintf(_T("窗口左上角坐标: (%d,%d), 尺寸: %dx%d\n"), left, top, width, height);
} else {
_tprintf(_T("未找到窗口\n"));
}
return 0;
}
```
在这个例子中,你需要首先找到指定标题的窗口句柄,然后调用`GetWindowRect`获取窗口的矩形区域,并计算出具体的宽度和高度。
帮我写一个c++使用GetWindowRect获取到窗口坐标后,在该窗口绘制一个边框作为显示
好的,以下是使用GetWindowRect获取窗口坐标并绘制边框的C代码:
```
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 创建窗口
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = "MyWindowClass";
RegisterClass(&wc);
HWND hWnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL);
// 显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
// 获取窗口坐标
RECT rect;
GetWindowRect(hWnd, &rect);
// 转换为客户区坐标
POINT pt1 = { rect.left, rect.top };
POINT pt2 = { rect.right, rect.bottom };
ScreenToClient(hWnd, &pt1);
ScreenToClient(hWnd, &pt2);
rect.left = pt1.x;
rect.top = pt1.y;
rect.right = pt2.x;
rect.bottom = pt2.y;
// 绘制边框
HDC hdc = GetDC(hWnd);
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
SelectObject(hdc, hPen);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
DeleteObject(hPen);
ReleaseDC(hWnd, hdc);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
这段代码会创建一个窗口,并在窗口的客户区绘制一个红色边框,边框的大小和位置与窗口相同。使用GetWindowRect获取窗口坐标后,需要将其转换为客户区坐标,然后使用Rectangle函数绘制矩形边框。
阅读全文