Научно-исследовательская лаборатория систем ЧПУ
Научно-исследовательская лаборатория систем ЧПУ

Поиск по сайту:
 

Расписание курсов "Программирование SINUMERIK 810D/840D/840Di"



Класс CFlexButton

Автор: Мартинов Г. М.
Лаборатория систем ЧПУ кафедры КСУ, МГТУ "СТАНКИН"
Опубликовано: 13.05.2003
Версия текста: 1.0

Библиотека и демонстрационный пример  размер файла: 62,2 Kб
Полное описание класса CFlexButton и его UML модель  размер файла: 36,7 Kб


Рис. 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()
{ 
// :
//------- Enhanced Metafile Button init -------------------------------
CWnd *pFrame=GetDlgItem(IDC_ENH_METAFILE_BUTTON);
CRect rcWnd;
pFrame->GetWindowRect(rcWnd);
pFrame->DestroyWindow();//pFrame was just a placeholder anyway.
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 определяет перо для отрисовки рамки кнопки,
COLORREF m_BackColor // цвет фона для кнопки.
  • Установить или снять стиль кнопки можно при помощи метода:
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


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.