Не удается сохранить правильный размер моего подкласса CToolBar

Моя цель состоит в том, чтобы иметь производную CToolBar, которая имеет один элемент управления (CMFCShellTreeCtrl).

Что-то вроде:

class CFileTreeBar : public CToolBar

Всякий раз, когда его просят вычислить его размер, я хочу ответить, что это либо фиксированный минимум, либо размер клиентской области панели закрепления, к которой он прикреплен. Другими словами, он должен занимать всю высоту панели закрепления + фиксированную ширину (это закрепляется слева — точно так же, как Explorer размещает дерево папок слева).

Следовательно, в CFileTreeBar :: CalcFixedLayout он отвечает высотой, основанной на GetParent () -> GetWindowRect (rect), и шириной 250 пикселей.

Затем в OnSize CFileTreeBar изменяет размер CMFCShellTreeCtrl, чтобы использовать наш клиентский прямоугольник (максимизирует наш единственный элемент управления).

Это прекрасно работает, когда панель управления изначально отображается. И это прекрасно работает при изменении размера окна путем перетаскивания угла. CaclFixedLayout возвращает значение, отличное от его предыдущего значения (потому что размер окна изменился), и поэтому он вычисляет, что он должен занимать все вертикальное пространство, и в итоге я получаю сообщение WM_SIZE, сообщающее моей панели управления об изменении размера, что заставляет меня обновить размер CMFCShellTreeCtrl.

Я борюсь за то, чтобы нажать кнопку «развернуть» на CFrameWnd. В этом случае, по причинам, которые я на самом деле не понимаю, вызывается CalcFixedLayout, но панель док-станции имеет свой старый размер (он еще не был обновлен до нового размера на основе максимизации). Это приводит к тому, что мой код отвечает, что размер должен быть таким же, каким он был раньше, что приводит к тому, что работа фрейма MFC не выдает изменение размера (мы уже достигли требуемого размера).

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

Проблема возникает также при переходе от максимального к восстановленному. В этот момент вызов CalcFixedLayout указывает на то, что мы должны быть такими же высокими, как максимизированное окно (его текущий размер), и теперь работа с фреймом запускает код изменения размера, который в итоге делает нас больше, чем панель док-станции (после того, как размер уменьшен) к восстановленному размеру), и мы исчезаем ниже нижней части панели док-станции (обрезается по максимальному вертикальному экстенту).

Вопросы

  1. Есть хороший учебник или технический документ, показывающий, как панели взаимодействия и панели управления должны взаимодействовать в MFC? то есть полное описание того, как эта рама должна правильно совмещаться? Понимание того, как эти части сочетаются друг с другом и предназначены для согласованной работы, во многом поможет избежать взлома его работы, что позволит мне написать что-то круглое, чтобы, так сказать, соответствовать круглому отверстию.
  2. Есть ли подобный пример проекта, о котором кто-нибудь знает? Необходимость разобраться в этом мусоре невероятно трудоемка — если где-то есть пример, который делает это, то это было бы здорово …

0

Решение

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

http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]