Как изменить размер / переместить элементы управления в окне при изменении размера окна

#c #winapi

#c #winapi

Вопрос:

При использовании любой программы изменение размера окна приводит к изменению расположения элементов управления, чтобы они помещались в окне. Как вы это делаете с помощью C ? Я видел много примеров C #, но C нигде не было.

Комментарии:

1. Если вы используете фреймворк GUI, ищите встроенную поддержку. Если вы записываете в необработанный winapi, то обрабатывайте события размера и настраивайте дочерние элементы управления вручную.

2. Я надеялся сделать это только с помощью winapi. Я думал о том, как сделать это вручную, но решил, что должен быть какой-то встроенный способ. Я полагаю, что нет: (

Ответ №1:

Вы можете использовать SetWindowPos API в WM_SIZE сообщении:

Я создаю образец и использую следующий код:

 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hButton;
    switch (message)
    {
    case WM_CREATE:
        hButton = CreateWindow(TEXT("Button"), TEXT("OK"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 50, 50, 50, 50, hwnd, NULL, NULL, NULL);
        return 0;
    case WM_SIZE:
    {
        int cxClient = LOWORD(lParam);
        int cyClient = HIWORD(lParam);
        SetWindowPos(hButton, NULL, cxClient / 3, cyClient / 4, cxClient / 5, cyClient / 2, SWP_SHOWWINDOW);
        return 0;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}
  

Размер созданной кнопки будет изменен в соответствии с моим окном изменения размера:

введите описание изображения здесь

Комментарии:

1. обычно требуется переместить несколько (n) элементов управления в окне, в этом случае лучше использовать BeginDeferWindowPos DeferWindowPos (n ) EndDeferWindowPos . также обычно для каждого элемента управления необходимо выбрать 2 точки (слева, сверху) и (справа, снизу), а расстояние между точкой и точкой на родительской границе является постоянным

2. @RbMm Спасибо за ваше дополнение, я просто предлагаю несколько возможных методов, возможно, вы сможете опубликовать свой ответ.