Ответ 1
Попробуйте использовать GetClientRect
для получения координат и MapWindowPoints
для его преобразования.
Я хочу писать код следующим образом:
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;
}
Попробуйте использовать GetClientRect
для получения координат и MapWindowPoints
для его преобразования.
Я думаю, вам нужно что-то подобное. Я не знаю, как найти контроль. Этот сегмент кода присваивает положение метки в центре формы окна в соответствии с размером формы.
AllignLabelToCenter(lblCompanyName, frmObj)
Public Sub AllignLabelToCenter(ByRef lbl As Label, ByVal objFrm As Form)
Dim CenterOfForm As Short = GetCenter(objFrm.Size.Width)
Dim CenterOfLabel As Short = GetCenter(lbl.Size.Width)
lbl.Location = New System.Drawing.Point(CenterOfForm - CenterOfLabel, lbl.Location.Y)
End Sub
Private ReadOnly Property GetCenter(ByVal obj As Short)
Get
Return obj / 2
End Get
End Property