WTL макет с изменением размера - PullRequest
4 голосов
/ 23 мая 2011

Я хотел бы знать, как люди с большим знанием WTL могли бы создать что-то вроде этого:

Диалог с изменяемым размером (-> WS_THICKFRAME), который содержит две «области».Одна область увеличивается в направлении y при изменении размера и содержит несколько компонентов, которые должны быть расположены на одинаковом расстоянии друг от друга по высоте (например, при 0%, 25%, 50%, 75% и 100% высоты области).

Другая область находится ниже и имеет фиксированную высоту.При изменении размера обе области должны расти в направлении x.

Здесь важны следующие вопросы: а) какие контейнеры и т. Д. Использовать для этих двух областей;элемент управления с равным расстоянием, например, afaik)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2012

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

class CFooWindow : ... public CDialogResize<CFooWindow> {

    BEGIN_MSG_MAP(CFooWindow)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        ... more messages here
        CHAIN_MSG_MAP(CDialogResize<CFooWindow>)
    END_MSG_MAP()

    // This map defines how the controls within the window are resized.
    // You can also use DLGRESIZE_GROUP() to group controls together.
    BEGIN_DLGRESIZE_MAP(CFooWindow)
       DLGRESIZE_CONTROL(IDC_WINDOW_TOP,    DLSZ_SZIZE_X | DLSZ_SIZE_Y);
       DLGRESIZE_CONTROL(IDC_WINDOW_BOTTOM, DLSZ_SZIZE_X | DLSZ_MOVE_Y);
    END_DLGRESIZE_MAP()


    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {

       DlgResize_Init();
    }
      .. the rest of your class here
}

Вы можете реализовать промежутки между элементами управления, имея DLGRESIZE_GROUP() и разделяя элементы управления в файле ресурсов так, как вы бы хотели, чтобы они были разделены в окончательном макете. Размер из предметов будут обновлены. Если вам нужно что-то слишком сложное, вы можете использовать обратный вызов изменения размера диалогового окна, чтобы контролировать точное размещение элемента. Просто внедрите CDlgResize::OnSize(UINT nType, int cx, int cy) в своем классе и обновите вручную размер элемента управления.

0 голосов
/ 24 мая 2011

Это можно сделать с помощью сплиттера.Вот отличное руководство: http://www.codeproject.com/KB/wtl/wtl4mfc7.aspx

Вы можете установить SPLIT_BOTTOMALIGNED в качестве расширенного стиля, чтобы изменять размер только верхней панели (нижняя панель не изменяется).

...