Динамический макет

С помощью MFC в Visual Studio 2015 можно создавать диалоги, которые пользователь может изменить размер, и вы можете управлять способом изменения размера макета. Например, можно присоединить кнопки, которые находятся в нижней части диалогового окна, к нижней границе, чтобы они всегда находились в нижней части окна. Также можно настроить некоторые элементы управления, например списки, поля ввода и текстовые поля, таким образом, чтобы они развертывались, когда пользователь увеличивает размер диалогового окна.

Задание параметров динамического макета в диалоговом окне MFC

Если пользователь изменяет размер диалогового окна, элементы управления в диалоговом окне могут изменить свой размер или перемещаться в направлении осей X и Y. Изменение размера или положения элемента управления, когда пользователь изменяет размер диалогового окна, называется динамическим макетом. Например, ниже показано диалоговое окно до изменения его размера.

Dialog before being resized.

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

Dialog after being resized.

Вы можете управлять динамическим макетом, указывая сведения для каждого элемента управления в редакторе ресурсов в интегрированной среде разработки или программно предоставляя доступ к объекту для определенного элемента управления и устанавливая CMFCDynamicLayout свойства.

Задание свойств динамического макета в редакторе ресурсов

Поведение динамического макета для диалогового окна можно задать без написания кода, а с помощью редактора ресурсов.

Задание свойств динамического макета в редакторе ресурсов

  1. Откройте проект MFC, затем откройте диалоговое окно, с которым необходимо работать в редакторе диалоговых окон.

    Open the dialog in the resource editor.

  2. Выберите элемент управления и в окне свойствпредставлении классов) задайте его свойства динамического макета. Раздел динамического макета в окне "Свойства" содержит свойства перемещения типа, типа изменения размера и в зависимости от значений, выбранных для этих свойств, определенных свойств, определяющих, сколько элементов управления перемещаются или изменяются. Перемещение типа определяет, как элемент управления перемещается по мере изменения размера диалогового окна; Тип размера определяет изменение размера элемента управления по мере изменения размера диалогового окна. Перемещение типа и типа размера может быть горизонтальным, вертикальным, обоим или нет в зависимости от измерений, которые необходимо изменить динамически. «Горизонтально» относится к оси X, а «Вертикально» — к оси Y.

  3. Если вы хотите, чтобы элемент управления, например кнопка, располагался в фиксированном размере и остается на месте в правом нижнем углу, как обычно для кнопок "ОК" или "Отмена", задайте для параметра "Тип размера" значение "Нет" и задайте для параметра "Перемещение типа" значение "Оба". Для значений скользящего X и перемещения Y в разделе "Движущийся тип" задайте 100 % , чтобы элемент управления оставался фиксированным расстоянием от нижнего правого угла.

    Dynamic Layout.

  4. Предположим, что у вас также есть элемент управления, который должен увеличиваться при расширении диалогового окна. Как правило, пользователь может развернуть диалоговое окно для увеличения размера многострочного поля ввода, чтобы увеличить размер текстового поля, или же развернуть элемент управления списком, чтобы увидеть больше данных. В этом случае задайте тип размера "Оба" и задайте для типа перемещения значение none. Затем задайте для значений Sizing X и Sizing Y значение 100.

    Dynamic Layout Settings.

  5. Попробуйте ввести другие значения, которые могут быть применимы для элементов управления. Диалоговое окно с однострочного текстового поля может иметь значение "Тип размера", равный "Горизонтальный ", например.

Задание свойств динамического макета программным образом

Описанную выше процедуру можно использовать для задания свойств динамического макета диалогового окна на этапе разработки. Но, если вы хотите управлять динамическим макетом во время выполнения, свойства динамического макета можно задавать программным образом.

Задание свойств динамического макета программным образом

  1. Найдите или создайте место в коде реализации класса своего диалогового окна, где необходимо задать динамический макет для диалогового окна. Например, можно добавить метод, например AdjustLayout в диалоговом окне, и вызывать его из тех мест, где будет необходимо изменять макет. Можно выполнить вызов из конструктора сначала или же после внесения изменений в диалоговое окно.

  2. Для диалогового CWnd окна вызовите Метод GetDynamicLayout класса. GetDynamicLayout возвращает указатель на объект CMFCDynamicLayout .

    CMFCDynamicLayout* dynamicLayout = pDialog->GetDynamicLayout();
    
  3. Для первого элемента управления, в который требуется добавить динамическое поведение, используйте статические методы в классе динамического макета, чтобы создать структуру Move Параметры, которая кодирует способ настройки элемента управления. Для этого сначала выберите соответствующий статический метод: CMFCDynamicLayout::MoveHorizontal, CMFCDynamicLayout::MoveVertical, CMFCDynamicLayout::MoveNone или CMFCDynamicLayout::MoveHorizontalAndVertical. Вы передаете процентное соотношение для перемещения по горизонтали или по вертикали. Эти статические методы возвращают вновь созданный объект MoveSettings, который можно использовать для задания поведения перемещения элемента управления.

    Помните, что 100 означает перемещение на столько же, на сколько диалоговое окно изменяет свой размер. При этом край элемента управления будет оставаться на фиксированном расстоянии от новой границы.

    MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontal(100);
    
  4. Выполните то же самое для поведения размера, которое использует тип Size Параметры. Например, чтобы указать, что элемент управления не изменяет размер при изменении размера диалогового окна, используйте следующий код:

    SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();
    
  5. Добавьте элемент управления в диспетчер динамического макета с помощью метода CMFCDynamicLayout::AddItem . Для различных способов указания требуемого элемента управления предусмотрены две перегрузки. Одна использует дескриптор окна элемента управления (HWND), а другая — идентификатор элемента управления.

    dynamicLayout->AddItem(hWndControl,
    moveSettings,
    sizeSettings);
    
  6. Повторите для каждого элемента управления, который нужно переместить или для которого нужно изменить размер.

  7. При необходимости можно использовать метод CMFCDynamicLayout::HasItem , чтобы определить, находится ли элемент управления в списке элементов управления, подверженных динамическим изменениям макета, или метод CMFCDynamicLayout::IsEmpty , чтобы определить, существуют ли элементы управления, подлежащие изменениям.

  8. Чтобы включить макет диалогового окна, вызовите метод CWnd::EnableDynamicLayout .

    pDialog->EnableDynamicLayout(TRUE);
    
  9. При следующем изменении размера диалогового окна вызывается метод CMFCDynamicLayout::Adjust, который фактически применяет параметры.

  10. Если вы хотите отключить динамический макет, вызовите CWnd::EnableDynamicLayout со значением FALSE для параметра bEnabled.

    pDialog->EnableDynamicLayout(FALSE);
    

Задание динамического макета программным образом из файла ресурсов

  1. Используйте метод CMFCDynamicLayout::MoveHorizontalAndVertical, чтобы указать имя ресурса в соответствующем файле скрипта ресурсов (RC-файл), который указывает сведения о динамическом макете, как показано в следующем примере:

    dynamicLayout->LoadResource("IDD_DIALOG1");
    

    Именованный ресурс должен ссылаться на диалоговое окно, содержащее сведения о макете в виде записи AFX_DIALOG_LAYOUT в файле ресурса, как показано в следующем примере:

    /////////////////////////////////////////////////////////////////////////////
    //
    // AFX_DIALOG_LAYOUT
    //
    
    IDD_MFCAPPLICATION1_DIALOG AFX_DIALOG_LAYOUT
    BEGIN
    0x0000,
    0x6400,
    0x0028,
    0x643c,
    0x0028
    END
    
    IDD_DIALOG1 AFX_DIALOG_LAYOUT
    BEGIN
    0x0000,
    0x6464,
    0x0000,
    0x6464,
    0x0000,
    0x0000,
    0x6464,
    0x0000,
    0x0000
    
    END
    

См. также

Класс CMFCDynamicLayout
Классы элементов управления
Классы диалоговых окон
Редактор диалоговых окон
Макет динамического диалогового окна для MFC в Visual C++ 2015