Я хочу иметь возможность написать код, подобный этому:
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()
(спасибо, Сергий):
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;
}