Класс CFlexButton
Автор: Мартинов Г. М. Лаборатория систем ЧПУ кафедры КСУ, МГТУ "СТАНКИН"
Опубликовано: 13.05.2003 Версия текста: 1.0
Библиотека и демонстрационный пример  Полное описание класса CFlexButton и его UML модель 
 Рис. 1. Пример использования класса CFlexButton в стандартном диалоговом приложение.
CFlexButton - универсальный элемент - кнопка, позволяющая отрисовывать многострочный текст или метафайл в зависимости от заданного стиля.
Кнопка может быть в отмеченном, подсвеченном, нажатом или нормальном состоянии. При выводе метафайлов каждому состоянию кнопки соответствовует свой метафайл. В зависимости от стиля кнопка может быть обычной, checkable или fixed. Кнопка checkable при первом щелчке мыши нажимается, а при повторном щелчке мыши отжимается, поведение аналогично стандартному check box элементу. Поведение кнопки fixed похоже на поведение кнопки checkable, но отжать ее можно только вызовом метода класса.
Предоставляются функциональные возможности: загрузка метафайлов, отрисовка кнопки в различных режимах, управление состоянием и внешним видом элемента, реакция на щелчок мышью по элементу управления, hotlight-подсветка при перемещении мыши над элементом, tool tips и т.д..
ПРИМЕЧАНИЕ
Класс написан с использованием библиотеки MFC и может использоваться только в MFC-проектах. |
Использование класса CFlexButton
Чтобы воспользоваться кнопкой CFlexButton, в первую очередь, необходимо включить в проект заголовочный файл FlexButton.h и файл EnhMetafileButton.lib для линковки. Необходимо также, чтобы файл EnhMetafileButton.dll находился в каталоге с приложением.
На примере встраивания класса CFlexButton нужно проделать следующие шаги:
1. Добавить в класс диалога (или другого окна содержащего кнопку) объект класса CFlexButton.
#include "FlexButton.h"
class CEnhMetafileButtonDlgDlg : public CDialog
{
protected:
CFlexButton m_EngMetafileButton;
}
|
2. Создать кнопку и расположить ее в заданной области. Это сделано в функции OnInitDialog(). В ресурсе диалогового окна создан элемент-заглушка (например, рамки для текста). Замена элемента-заглушки на объект класса CFlexButton осуществляется, как показано ниже:
BOOL CEnhMetafileButtonDlgDlg::OnInitDialog()
{
CWnd *pFrame=GetDlgItem(IDC_ENH_METAFILE_BUTTON);
CRect rcWnd;
pFrame->GetWindowRect(rcWnd);
pFrame->DestroyWindow();
ScreenToClient(rcWnd);
CString String;
String.LoadString(IDS_ENH_MF_BUTTON_TEXT);
m_EngMetafileButton.Create(String, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW|WS_TABSTOP| WS_CLIPCHILDREN|WS_CLIPSIBLINGS, rcWnd, this, IDC_ENH_METAFILE_BUTTON);
}
|
Методы класса CFlexButton:
- Свойство m_DotPen определяет перо для отрисовки рамки кнопки,
- Установить или снять стиль кнопки можно при помощи метода:
void CFlexButton::ChangeFlexButtonStyle(DWORD dwNewStyleFlag, BOOL blAdd = TRUE);
dwNewStyleFlag
|
blAdd - состояние флага. TRUE - установлен.
Получить текущий стиль можно методом:
const DWORD& CFlexButton::get_FlexButtonStyle();
|
Возможные флаги стилей:
FB_STYLE_SYSTEM_SELECT_FRAME - определяет, будет ли кнопка иметь системную рамку или собственную рамку, отрисованную с помощю пера m_DotPen.
FB_STYLE_USE_ENH_METAFILE - при установке этого флага на кнопке будет отрисовываться метафайл, иначе - текст.
FB_STYLE_ENABLE_HOTLIGHT - если указатель мыши находится над кнопкой, кнопка подсвечивается;
FB_STYLE_CHECKABLE - устанавливает поведение кнопки, превращая ее в кнопку с фиксацией.
FB_STYLE_FROST_CHECKABLE - если установлен этот стиль, кнопка становится fixed и не может быть отжата при повторном нажатии на неё (для того, чтобы отжать кнопку, требуется вызов методаCFlexButton::ChangeFlexButtonState().)
- Изменить состояние кнопки можно вызовом:
void CFlexButton::ChangeFlexButtonState(DWORD dwNewStateFlag, BOOL blAdd = TRUE);
|
dwNewStateFlag - изменяемый флаг состояния;
blAdd - если TRUE, то флаг будет установлен, иначе - сброшен.
Получить текущее состояние можно методом:
const DWORD& CFlexButton::get_FlexButtonState();
|
- Возможные флаги состояний:
FB_STATE_HOTLIGHT - кнопка подсвечена
FB_STATE_CHECKED - кнопка нажата
- Загрузка метафайла осуществляется методом:
BOOL CFlexButton::LoadEnhMetaFiles(LPCTSTR lpszMetaFileResource, LPCTSTR lpszMetaFileResourceSel, LPCTSTR
lpszMetaFileResourceFocus, LPCTSTR lpszMetaFileResourceDisabled);
|
lpszMetaFileResource - обязательный параметр. Содержит указатель на строку с именем метафайла для обычного состояния кнопки.
lpszMetaFileResourceSel - Содержит указатель на строку с именем метафайла для нажатого состояния кнопки. Может быть NULL.
lpszMetaFileResourceFocus - Содержит указатель на строку с именем метафайла для кнопки, имеющей фокус ввода. Может быть NULL.
lpszMetaFileResourceDisabled - Содержит указатель на строку с именем метафайла для кнопки в отключенном (disabled) состоянии. Может быть NULL.
Отрисовка кнопки производится вызовом:
void CFlexButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
|
В зависимости от того, должен ли выводиться метафайл или текст, вызываются внутренние методы MetaFileDrawItem или FlexTextDrawItem соответственно.
Класс определяет несколько методов обработки событий системы:
void CFlexButton::OnMouseMove(UINT nFlags, CPoint point);
|
Перегруженная функция CFlexButton::OnMouseMove() для подсветки. Вызывается в зависимости от того, включена подсветка или выключена.
CFlexButton::OnClicked();
|
Обрабатывает событие нажатие кнопки, если установлен стиль FB_STYLE_CHECKABLE
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. |