Я хочу писать код следующим образом:
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;
}