Подтвердить что ты не робот

Как получить позицию элемента управления относительно окна клиента?

Я хочу писать код следующим образом:

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;
}
4b9b3361

Ответ 1

Попробуйте использовать GetClientRect для получения координат и MapWindowPoints для его преобразования.

Ответ 2

Я думаю, вам нужно что-то подобное. Я не знаю, как найти контроль. Этот сегмент кода присваивает положение метки в центре формы окна в соответствии с размером формы.

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