【发布时间】:2010-12-29 09:21:12
【问题描述】:
我希望能够编写这样的代码:
HWND hwnd = <the hwnd of a button in a window>;
int positionX;
int positionY;
GetWindowPos(hwnd, &positionX, &positionY);
SetWindowPos(hwnd, 0, positionX, positionY, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
让它什么都不做。但是,我不知道如何编写一个GetWindowPos() 函数,以正确的单位给出答案:
void GetWindowPos(HWND hWnd, int *x, int *y)
{
HWND hWndParent = GetParent(hWnd);
RECT parentScreenRect;
RECT itemScreenRect;
GetWindowRect(hWndParent, &parentScreenRect);
GetWindowRect(hWnd, &itemScreenRect);
(*x) = itemScreenRect.left - parentScreenRect.left;
(*y) = itemScreenRect.top - parentScreenRect.top;
}
如果我使用这个函数,我会得到相对于父窗口左上角的坐标,但是SetWindowPos() 想要相对于标题栏下方区域的坐标(我假设这是“客户区",但是 win32 术语对我来说有点新)。
解决方案
这是有效的GetWindowPos() 函数(感谢 Sergius):
void GetWindowPos(HWND hWnd, int *x, int *y)
{
HWND hWndParent = GetParent(hWnd);
POINT p = {0};
MapWindowPoints(hWnd, hWndParent, &p, 1);
(*x) = p.x;
(*y) = p.y;
}
【问题讨论】:
-
它是如何工作的,DirectX有什么用。 directx的新手。我做了我自己的功能来做到这一点
-
是的,它是一个windows应用程序,因此使用了win32 api。
标签: c++ user-interface winapi