帮我帮我用qt写一个使用GetWindowRect获取到窗口坐标后,在该窗口绘制一个边框作为显示
时间: 2023-04-06 17:03:34 浏览: 331
好的,这个问题我可以回答。您可以使用Qt的QPainter类来在窗口上绘制边框。具体步骤如下:
1. 使用GetWindowRect获取窗口的坐标信息。
2. 创建一个QWidget对象,设置其大小和位置为窗口的大小和位置。
3. 重写QWidget的paintEvent()函数,在该函数中使用QPainter类绘制边框。
4. 将该QWidget对象作为子窗口添加到目标窗口中。
这样就可以在目标窗口上绘制一个边框了。希望这个回答能够帮到您。
相关问题
帮我写一个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函数绘制矩形边框。
win32gui.GetWindowRect 获取的坐标不准
有可能是因为GetWindowRect函数获取的是窗口相对于屏幕的坐标,而不是窗口相对于父窗口的坐标。如果窗口有父窗口,那么获取到的坐标是相对于屏幕的坐标,需要通过ScreenToClient函数将其转换为相对于父窗口的坐标。以下是将窗口坐标转换为客户端坐标的示例代码:
```python
import win32gui
import win32api
hwnd = win32gui.FindWindow(None, "Window Name")
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
client_x, client_y = win32gui.ScreenToClient(hwnd, (left, top))
width = right - left
height = bottom - top
print("Client coordinates: ", client_x, client_y)
print("Width: ", width)
print("Height: ", height)
```
注意要将hwnd参数替换为你想要获取坐标的窗口的句柄。如果你仍然发现获取的坐标不准确,可能是因为窗口本身的坐标信息不准确导致的,你可以尝试使用其他的窗口坐标获取函数来进行验证。
阅读全文