Как получить позицию элемента управления относительно прямоугольника клиента окна? - PullRequest
16 голосов
/ 23 декабря 2009

Я хочу иметь возможность написать код, подобный этому:

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

Ответы [ 2 ]

17 голосов
/ 23 декабря 2009

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

1 голос
/ 23 декабря 2009

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...