15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Окно наподобие левого фрейма Outlook с использованием ATL.

Автор: Alex Blekhman

  • Скачать исходник - 74 Kb
  • Скачать откомпилированный пример - 30 Kb

    Sample Image - WinchCtrl1.jpg WinchCtrl2.jpg

    Введение

    Такой эффект ещё используется в Windows, при нажатии на кнопку Пуск (Start), если все пункты меню не влезают на экран, то высвечиваются дополнительные бары, позволяющие прокручивать меню.

    Требования

    • ATL v3.0 и выше
    • commctrl.dll версии 4.71 и выше
    • поддержку STL включений
    • поддержку CRT включений (только для демонстрашки)
    • любой компилятор C++ совместимый
    • MS Platform SDK

    Внимание: данный пример использует ключевый слова компилятора MS Visual C++ (типа #pragma ) , но они могут быть легко переправлены для любого Win32 совместимого компилятора.

    CButtonEx (наследуется от CWindowImpl; файл: ButtonEx.h)

    Класс CButtonEx позволяет Вам создать кнопки с иконками и описанием(caption). Когда кнопка активируется, путём установки переменной m_bIsActive в true, класс рисует caption используя шрифт bold. Иначе используется GUI шрифт по умолчанию.

    CWinch (наследуется от CWindowImpl; файл: Winch.h,Winch.cpp)

    Класс CWinch служит для создания собственно самого окна наподобие MS Outlook's "Outlook Bar". Окно содержит кнопки-полоски с связанными с ними окошками. Когда пользователь кликает на полоску, то она перемещается вверх или вниз вместе со своим окошком. Вы можете добавлять и удалять полоски..

    CWinchCtrl (наследуется от CWindowImpl; файл: WinchCtrl.h)

    Класс CWinchCtrl расширяет возвожности данного элемента управления, имеет функции-члены типа CWinch и обеспечивает доступ к его методам.

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

    Во-первых, Вам придётся добавить в Ваши исходники файл ‘WinchCtr.h'. Создать объект CWinchCtrl в стёке или динамически, используя оператор new. Затем вызвать метод Create() класса CWinchCtrl для создания окна объекта. Теперь Вы можете добавлять или удалять бары, вызывая AppendBar() и RemoveBar(), соответственно. Перед добавлением, Вам потребуется создать для каждого бара своё окно и и связать его с баром. Так же Вы можете делать активной любую полосу, вызывая функцию ActivateBar(). И в заключении, Вы можете получать и устанавливать описание (caption) для любой полосы. Запомните, что после добавления полосы невозможно будет изменить иконку полосы. Если Вы не хотите, чтобы полоса имела иконку, то в параметре иконки укажите NULL. Также можно создавать полоски без описания (caption).

    Как уже упоминалось, с каждой полоской связано отдельное окно, и его Вам придётся создать. Каждое такое окно может быть как обычным элементом управления Windows, так и пустым окном, а также это может быть MFC-окно, имеющее определённые ограничения - на чтение. Класс CWinch будет отражать все уведомительные сообщения (WM_NOTIFY) обратно в созданное окно для полоски. Внимание! Если Ваше MFC окно основано на отражающих сообщениях MFC (т.е. используя макрос ON_NOTIFY_REFLECT[EX]) - это не будет работать. В данном случае Вы должны обработать сообщения, отраженные CWinch, используя обычную макрокоманду ON_NOTIFY. Чтобы быть уверенным, что Вы получили отражённое сообщение, проверьте аргумент wParam сообщения WM_NOTIFY – это будет тот же идентификатор (ID) с которым было создано окно.

    Настройка

    В файле ‘Common.h' содержится несколько констант, которые упростят Вам жизнь:

    CX_ICON, CY_ICON – габариты маленькой иконки.

    CY_BARBUTTON_HEIGHT – высота полоски. Если полоски плохо выглядят в Вашей системе, то данная константа как раз поможет откорректировать их. Естевственно, полоса не может быть уже, чем иконка, которую она содержит.

    CX_3DBORDER, CY_3DBORDER – эта константа поможет правильно отобразить полоску в нажатом и отпущенном состояниях.

    ACCELERATE(val) – данная макро-команда ускоряет приращение движения, когда встречается анимация скроллинга.

    SCROLL_SPEED – эта константа определяет задержку между кадрами анимации ("frames") в функции SmoothScroll(). Я пробовал различные значения под Win2K, WinMe и Win95. Вообще-то, если компьютер достаточно мощьный, то оптимальное значение будет 15ms.

    WM_INVALIDATE, WM_REDRAW – зарегистрированные сообщения, используемые с функцией SendMessageToDescendants(). Можно конечно обойтись и без них, но тогда для каждой кнопки полоски надо вызывать InvalidareRect() и RedrawWindow(). Мне это было слишком лениво :).

    ATLVERIFY(exp) – удивительно, что ATL не поддерживает данную макро команду. Так что я скопировал один из них из MFC.

    Miscellaneous

    Я оставил файл .opt в примере, для того, чтобы сохранить организацию дерева в ClassView.