Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

TBN_GETBUTTONINFO посылается, когда пользователь настраивает панель

инструментов, которая использует это извещение, чтобы получить информацию, необходимую блоку диалога настройки панели инструментов; указатель pNotifyStruct обработчика указывает на структуру TBNOTIFY, поле iltem которой содержит индекс кнопки; обработчик должен заполнить поля структуры и в переменной result возвратить TRUE; если поля структуры по каким-либо причинам не заполнены, то возвращается FALSE

TBN QUERYDELETE посылается, когда пользователь настраивает панель инструментов, чтобы определить, может ли кнопка быть удалена с панели инструментов; указатель pNotifyStruct обработчика

указывает на структуру TBNOTIFY, поле iltem которой содержит индекс удаляемой кнопки; обработчик должен возвратить TRUE в переменной result, чтобы удалить кнопку, или FALSE, чтобы предотвратить ее удаление

TBN QUERYINSERT посылается, когда пользователь настраивает панель инструментов, чтобы определить, может ли кнопка быть вставлена в панель инструментов слева от указанной; указатель pNotifyStruct обработчика указывает на структуру TBNOTIFY, поле iltem которой содержит индекс кнопки, которую требуется вставить; обработчик должен возвратить TRUE в переменной result, чтобы вставить кнопку, или FALSE, чтобы предотвратить ее

вставку

TBN TOOLBARCHANGE посылается, когда пользователь закончил настройку панели инструментов; указатель pNotifyStruct обработчика указывает на структуру NMHDR; обработчик может ничего невозвращать

В заключение отметим, что настройка панели элементов управления — достаточно трудоемкий процесс, необходимо написать много функций, пусть и не больших по размеру. Кроме того, настраивать объект, созданный на базе класса CToolBar, несколько сложнее, чем объект класса CToolBarCtrl. Связано это с тем, что последний класс сам по себе не поддерживает списков описаний кнопок, и программист вынужден это делать самостоятельно, что существенно упрощает обработку такого уведомляющего сообщения, как TBN_GETBUTTONINFO. С другой стороны, объекты класса CToolBarCtrl не обеспечены поддержкой со стороны библиотеки классов MFC возможности привязки и управления типом расположения, в отличие от объектов класса CToolBar.

Класс CStatusBar

Рассмотрев, достаточно подробно, все аспекты работы с панелью инструментов, переходим к обсуждению не менее полезного элемента управления — строки состояния. Для него библиотека MFC также содержит два класса — CStatusBar и CStatusBarCtrl.

Класс CStatusBar определяет поведение строки состояния — панели элементов управления, отображаемой полосой, которую можно разделить на несколько областей для раздельного вывода в них текста или графической информации. Наиболее часто области используются для вывода сообщений (например, расширенной информации об элементах меню или о кнопках панели инструментов) и для отображения индикаторов состояния (например, клавиш <Caps Lock>, <Num Lock> и <Ins>). В качестве стандартного шрифта для строки состояния используется шрифт MS Sans Serif высотой 10 пунктов. Изменение изображения строки состояния осуществляется автоматически благодаря механизму ON_UPDATE_COMMAND_UI: во время цикла простоя (idle time) строка состояния вызывает обработчик команды ON_UPDATE_COMMAND_UI с идентификаторами строк областей индикации. Для строки состояния класс CCmdUI, обеспечивающий правильное функционирование обработчика, поддерживает следующие функции: CCmdUI::Enable и CCmdUI::SetText.

Строка состояния может работать в двух режимах — упрощенном и стандартном. В первом режиме разделение этого окна на несколько областей невозможно и выводить в него можно только текстовую информацию. В стандартном режиме приложение может разбить окно строки состояния на несколько областей для раздельного вывода в них текстовой или графической информации. По умолчанию принимается, что самая левая область — "эластичная": ее длина определяется длиной области строки состояния, не используемой всеми другими областями, которые, к тому же, выровнены по правому краю. Переход из одного режима в другой осуществляется при помощи сообщения SB_SIMPLE. Все настройки обычно проводятся перед первым отображением строки состояния на экране.

Перейдем теперь к рассмотрению основных членов этого класса.

CStatusBar::CStatusBar() -

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

BOOL CStatusBar::Create( CWnd *pParentWnd,

DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR) -

создает дочернее окно "строка состояния", ассоциирует его с объектом CStatusBar, инициализирует шрифт и устанавливает его размер в значение, заданное по умолчанию. Для строки состояния помимо стандартных стилей окна доступны еще следующие: CBRS_TOP, CBRS_BOTTOM, CBRS_NOALIGN и SBRS_SIZEGRIP. Обратите внимание на последний стиль, при котором правый нижний угол строки состояния принимает вид, показанный на рис. 26.

Рис. 26. Строка состояния, созданная со стилем SBRS_SIZEGRIP

По умолчанию, строка состояния располагается в нижней части родительского окна. Однако, при желании, вы можете расположить ее и в верхней части, использовав стиль CBRS_TOP. Очевидно, что этот стиль нельзя комбинировать со стилем SBRS_SIZEGRIP, т. к., во-первых, такой элемент управления будет выглядетьоченьстранно, аво-вторых, оннебудетработатьтак, какожидаетпользователь.

BOOL CStatusBar::Setlndicators( const UINT IplDArray,

int nIDCount) -

устанавливает идентификатор каждой области в значение, заданное соответствующим элементом массива IplDArray, загружает для них строки ресурса и записывает соответствующие текстовые строки в эти области. Параметр nIDCount определяетчислоэлементоввмассивеидентификаторов.

void CStatusBar::SetPanelnfo( int nlndex,

UlNTnID, UINT nStyle, int cxWidth) -

устанавливает для области, заданной номером nlndex, новые значения идентификатора (пЮ), стиля (nStyle) и ширины (cxWidth). Поддерживаются следующие дополнительныестили:

SBPS_NOBORDERS вокруг области нет трехмерной рамки

SBPS_POPOUT текст рисуется с рамкой, которая выглядит приподнятой надповерхностьюстроки состояния

SBPS_DISABLED в область запрещен вывод текста

SBPS_STRETCH "эластичная" (stretch) область, занимающая ту часть

строкисостояния, котораянеиспользуетсяподдругиеобласти; этотстильможетиметь толькооднаобластьстрокисостояния

SBPS_NORMAL обычная область — без рамок и без возможности растяжения

void CStatusBar::GetPanelnfo( int nlndex,

UINT &nlD, UlNT&nStyle, int &cxWidth) -

позволяет получить информацию об области строки состояния, заданной номером nlndex, включающую идентификатор (nID), стиль (nStyle) и ширину (cxWidth).

UINT CStatusBar::SetPaneStyle( int nlndex, UINT nStyle) -

устанавливает стиль (nStyle) области (nlndex) строки состояния.

UINT CStatusBar::GetPaneStyle(int nlndex) -

возвращает стиль области строки состояния, который определяет ее внешний вид. Номер области задается параметром nlndex.

BOOL CStatusBar::SetPaneText( int «Index,

LPCTSTR IpszNewText,

BOOL bUpdate = TRUE) -

записывает текст, на который указывает IpszNewText, в область строки состояния, заданную номером nlndex. Если параметр bUpdate равен TRUE, то после записитекстаобластьпомечаетсякакповрежденная дляеенемедленногообновления.

void CStatusBar::GetPaneText( int nlndex,

CString &rString) и CString CStatusBar::GetPaneText(int nlndex) —

позволяют получить текст, который находится в области с номером nlndex.

CStatusBarCtrl& CStatusBar::GetStatusBarCtrl() -

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

Класс CStatusBarCtrl

использования функциональных возможностей общего элемента управления STATUSBAR

можно пойти двумя путями: либо непосредственно создать окно CStatusBarCtrl, либо создать строку состояния на основе класса CStatusBar, а затем просто получить доступ к элементам объекта CStatusBarCtrl, вызвав функцию этого класса CStatusBar::CStatusBarCtrl. Остановимся на втором способе и не будем рассматривать непосредственное создание общего элемента управления STATUSBAR.

Для того чтобы прочитать текст из какой-либо области элемента управления, в классе реализована функция GetText:

int CStatusBarCtrl::GetText( LPCTSTR IpszText,

int nPane,

int *pType)

где пРапе — индекс области, из которой читается текст; IpszText — указатель на буфер, в который этот текст будет записан; рТуре — указатель на целое значение, вкоторомбудетвозвращенаинформация отипеотображениятекста.

Сама функция возвращает длину текста, которую можно также получить при помощи функции

int CStatusBarCtrl::GetTextLength( int nPane, int *pType)

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

BOOL CStatusBarCtrl::SetText( LPCTSTR IpszText,

int nPane, int nType)

где nPane — индекс области, в которую записывается текст из IpszText. Если nPane = 255, то строка состояния содержит единственную область, в которую можно выводить только текст. Параметр пТуре задает типотображениятекстаиможетприниматьодноиззначений:

О текствыводитсясрамкой, котораявыглядитутопленной SBT_NOBORDERS текст выводится без рамки

SBT_OWNERDRAW текст (или графическое изображение) выводится родительским окном во время обработки сообщения WM_DRAWITEM

SBT_POPOUT текст выводится с рамкой, которая выглядит приподнятой

Если пТуре принимает значение SBT OWNERDRAW, то в параметре IpszText передаются 32 бита данных. При выполнении этой функции область, в которую выводится текст, становится областью модификации, чтобы отобразить новый текст при получении сообщения WM_PAINT.

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

BOOL CStatusBarCtrl::SetParts( int nParts,

int *pWidths)

которая устанавливает число областей и координату правого края каждой из них. Число областей (nParts) не может быть больше 255. Параметр pWidths содержит адрес целочисленного массива, каждый элемент которого определяет позицию правого края соответствующей области. Если элемент равен -1, то правый край этойобластисовпадаетсправымкраемэлементауправления.

Обратную задачу позволяет решить функция

int CStatusBarCtrl::GetParts( int nParts,

int *pParts)

которая возвращаетчисло областей, на которое разбит элементуправления, а также координаты правыхкраев

областей, число которых запрашивается в параметре nParts. Если это число больше, чем имеется у элемента управления, то информация возвращается только для существующихобластей. Координаты записываются в целочисленный массив pParts, число элементов которого равно nParts. Если для какой-либо области в качестве координаты правого края области в массив записывается -1, то это означает, что он совпадаетсправым краем элементауправления.

Если требуется информация о размерах рамок элемента управления и его областей, то ее можно получить при помощи функции GetBorders, которая реализована в двух вариантах.

BOOLCStatusBarCtrl::GetBorders( int &nHorz,

int SnVert,

int SnSpacing) и

BOOL CStatusBarCtrl::GetBorders(int *pBorders) -

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

Помимо изменения горизонтальных размеров различных областей строки состояния, можно установить ее минимальную высоту, необходимую для отображения текстовой или графической информации:

void CStatusBarCtrl::SetMinHeight(int nMin) -

минимальная высота определяется суммой значения параметра nMin и двойной ширинырамки.

Для переключения между упрощенным и стандартным режимами работы строки состояния используется функция

BOOL CStatusBarCtrl::SetSimple(BOOL bSimple = TRUE) -

если bSimple равен TRUE, то элемент управления переводится в упрощенный режим, в противном случае — в стандартный. При переходе из одного режима в другойпроисходитнемедленнаяперерисовка строки состояния. Содержимое областей при переключении не теряется, т. к. данные соответствующих режимов хранятсявразличныхместах.

BOOL CStatusBarCtrl::GetRect( int nPane, LPRECT IpRect) -

эта срункция служит для получения размеров и координат прямоугольника, ограничивающего область nPane элемента управления. Информация о прямоугольнике записывается в структуру RECT, на которую указывает IpRect.

Как уже упоминалось, в строке состояния может находиться не только текстовая, но и графическая информация. Для реализации этой возможности необходимо сделать две вещи: при вызове функции CStatusBarCtrl::SetText указать константу SBT_OWNERDRAW и переопределить функцию

virtual void CStatusBarCtrl::Drawltem( LPDRAWITEMSTRUCT IpDrawltemStruct) -

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

Рассмотрим поля структуры DRAWITEMSTRUCT, применительно к элементу управления "строка состояния":

typedef struct tagDRAWITEMSTRUCT{

UINT CtlType;

// не используется

UINT CtllD;

 

UINT itemID;

// не используется

UINT itemAction;

UINT itemState;

// не используется

HWND hwndltem;

 

HOC hDC;

 

RECT rcltem;

 

DWORD itemData; } DRAWITEMSTRUCT;

Поле hwndltem содержит дескриптор окна строки состояния, поле Ctlld — ее идентификатор, а поле itemID

— номер области, которая будет перерисована. Контекст устройства, необходимый для выполнения операций рисования, находится в поле hDC, а координаты области, в которой будет осуществляться рисование, передаются через поле rcltem.