Моя цель состоит в том, чтобы иметь производную CToolBar, которая имеет один элемент управления (CMFCShellTreeCtrl).
Что-то вроде:
class CFileTreeBar : public CToolBar
Всякий раз, когда его просят вычислить его размер, я хочу ответить, что это либо фиксированный минимум, либо размер клиентской области панели закрепления, к которой он прикреплен. Другими словами, он должен занимать всю высоту панели закрепления + фиксированную ширину (это закрепляется слева — точно так же, как Explorer размещает дерево папок слева).
Следовательно, в CFileTreeBar :: CalcFixedLayout он отвечает высотой, основанной на GetParent () -> GetWindowRect (rect), и шириной 250 пикселей.
Затем в OnSize CFileTreeBar изменяет размер CMFCShellTreeCtrl, чтобы использовать наш клиентский прямоугольник (максимизирует наш единственный элемент управления).
Это прекрасно работает, когда панель управления изначально отображается. И это прекрасно работает при изменении размера окна путем перетаскивания угла. CaclFixedLayout возвращает значение, отличное от его предыдущего значения (потому что размер окна изменился), и поэтому он вычисляет, что он должен занимать все вертикальное пространство, и в итоге я получаю сообщение WM_SIZE, сообщающее моей панели управления об изменении размера, что заставляет меня обновить размер CMFCShellTreeCtrl.
Я борюсь за то, чтобы нажать кнопку «развернуть» на CFrameWnd. В этом случае, по причинам, которые я на самом деле не понимаю, вызывается CalcFixedLayout, но панель док-станции имеет свой старый размер (он еще не был обновлен до нового размера на основе максимизации). Это приводит к тому, что мой код отвечает, что размер должен быть таким же, каким он был раньше, что приводит к тому, что работа фрейма MFC не выдает изменение размера (мы уже достигли требуемого размера).
Следовательно, через мгновение панель док-станции расширяется, чтобы занимать все вертикальное пространство, но моя панель управления и лежащее в ее основе оболочка не изменились, а остались с устаревшим размером.
Проблема возникает также при переходе от максимального к восстановленному. В этот момент вызов CalcFixedLayout указывает на то, что мы должны быть такими же высокими, как максимизированное окно (его текущий размер), и теперь работа с фреймом запускает код изменения размера, который в итоге делает нас больше, чем панель док-станции (после того, как размер уменьшен) к восстановленному размеру), и мы исчезаем ниже нижней части панели док-станции (обрезается по максимальному вертикальному экстенту).
Закрепляемая панель инструментов с изменяемыми размерами довольно сложна в коде, в codeproject есть одна, которая весьма хороша. Вы можете изучить исходный код, чтобы увидеть, как автор делает это.
http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar
Других решений пока нет …