- •Задание 6. Добавление обработчиков сообщений для кнопок панели инструментов
- •Обработчики сообщений для кнопок панели инструментов программы MyPaint
- •Строка состояния
- •Задание 7. Добавление строки состояния
- •Отображение полей строки состояния
- •Изменение интерактивной справки
- •Подведение итогов
- •Глава 6. Создание модальных диалоговых окон
- •Диалоговые окна и ресурсы шаблонов диалоговых окон
- •Задание 1. Создание ресурса шаблона диалогового окна программы FontDemo
- •Элементы управления диалогового окна Format и их свойства
- •Классы диалоговых окон
- •Функции класса cDialog для управления диалоговыми окнами
- •Функции класса cDialog для манипулирования диалоговыми окнами
Строка состояния
Строка состояния (status bar) — то объект класса CStatusBar, который является производным от CControlBar. Класс CControlBar поддерживает окна панелей элементов управления, размещаемых в окне-рамке, код которого хранится в файлах MainFrm.h и MainFrm.cpp. Так как объект строки состояния CStatusBar внедрен в рамочное окно CMainFrame, то MFC создает строки состояния, когда создает рамочное окно и уничтожает ее, когда уничтожается рамочное окно. По отношению к рамочному окну строки состояния является дочерним окном, которое связывается с объектом CStatusBar. В типичном SDI-приложении объект CStatusBar находится в нижней части клиентской области главного окна. Окно представления обычно располагается между панелью инструментов и строкой состояния.
Окно строки состояния не принимает ввод от пользователя и не генерирует командных сообщений. Назначение строки состояния — показать в соответствующих полях интерактивную справку и состояние некоторых клавиш клавиатуры. Строка состояния поддерживает два типа текстовых полей: поле сообщений и поля индикаторов. В поле сообщений отображаются данные о состоянии приложения и описание команд приложения. Чтобы увидеть описание команды, достаточно поместить курсор мыши на кнопку панели инструментов. Поле индикаторов отображает состояние клавиш Scroll Lock, Num Lock, Caps Lock. Окно приложения и строка состояний показаны на рис.5.15.
Для создания и отображения строки состояния в главном окне программы необходимо сконструировать объект класса CStatusBar, определить массив индикаторов, создать окно строки состояния и прикрепить его к объекту CStatusBar, установить соответствие массива индикаторов и полей статусной строки.
Рис. 5.15. Строка состояний в главном окне программы MyPaint
Для конструирования объекта строки состояния необходимо в классе главного окна объявить объект класса CStatusBar и вызвать конструктор этого класса, который устанавливает параметры объекта по умолчанию. Прототип конструктора класса CStatusBar следующий:
CStatusBar ( );
Для создания строки состояния как дочернего окна класс CStatusBar имеет функции-члены CStatusBar::Create() и CStatusBar::CreateEx(), которые создают строку состояния как дочернее окно, сопоставляют его с объектом CStatusBar и устанавливают начальный шрифт и высоту строки. Рассмотрим прототип функции CStatusBar::Create()
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR );
Первый параметр pParentWnd определяет указатель на родительское окно для строки состояния, которая сама является дочерним окном. Второй параметр dwCtrlStyle задает стили строки состояния. В дополнение к стандартным Windows стилям, значения которых задаются константами с префиксами WS_ ( табл.Б5 приложения Б), строка состояния поддерживает дополнительные стили. Константа CBRS_TOP используется для расположения строки состояния в верхней части окна-рамки. Стиль CBRS_BOTTOM указывается на положение строки состояния в нижней части окна-рамки. Стиль CBRS_NOALIGN означает, что строка состояния не меняет положения в процессе изменения размеров родительского окна. Параметр nID является идентификатором дочернего окна строки состояния. Стандартной строке состояния присваивается идентификатор дочернего окна AFX_IDW_STATUS_BAR.
После создания строки состояния и прикрепления ее к объекту CStatusBar необходимо определить массив индикаторов. Если строка состояния создается MFC Application Wizard в процессе создания нового приложения, то массив индикаторов создается в файле MainFrm.cpp и имеет такое определение.
static UINT IndicatorsIDs [] = { ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };
Идентификатор ID_SEPARATOR предназначен для создания пропуска. Так как этот идентификатор размещен первым в массиве, то первое поле строки состояния будет пустым. MFC автоматически отображает внутри этого поля интерактивную справку, поэтому константа ID_SEPARATOR задает поле для строки сообщения. Другие константы служат идентификаторами строковых ресурсов и определяют поля индикаторов. Идентификаторы стандартных индикаторов создаются MFC Application Wizard и сохраняются в ресурсе таблицы строк String Table. Фрагмент таблицы строк показан ниже.
ID_INDICATOR_EXT 59136 EXT ID_INDICATOR_CAPS 59137 CAP ID_INDICATOR_NUM 59138 NUM ID_INDICATOR_SCRL 59139 SCRL ID_INDICATOR_OVR 59140 OVR ID_INDICATOR_REC 59141 REC
Обработчики сообщений обновления пользовательского интерфейса используют три идентификатора строковых ресурсов для индикаторов состояния клавиатуры в базовом классе окна-рамки: ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL. Эти идентификаторы определены с помощью MFC, которая предоставляет обработчики сообщений для полей с заданными идентификаторами. Эти обработчики отображают текущее состояние клавиш Caps Lock, Num Lock и Scroll Lock. Обратите внимание: второе, третье и четвертое поля выравниваются по правому краю строки состояния, а первое занимает все оставшееся место в левой части строки. Чтобы самому управлять строкой состояния, нужно применить другие константы для индикаторов и другой идентификатор дочернего окна, создав его с помощью редактора символов (Resource Symbols).
Массив индикаторов передается в качестве аргумента методу CStatusBar::SetIndicators(), который приводит строку состояние в соответствие с содержимым массива индикаторов. Ниже дан формат функции.
BOOL CStatusBar::SetIndicators(const UINT* lpIDArray, int nIDCount );
Параметры функции: lpIDArray — указатель на массив идентификаторов, nIDCount— количество элементов в массиве указателей lpIDArray.
Поскольку строка состояния создается и уничтожается вместе с главным окном, то рассмотренные выше функции следует вызывать в методе создания главного окна до его отображения на экране. Главное окно создается в результате посылки Windows сообщения WM_CREATE. Обработчиком этого сообщения является функция CWnd::OnCreate().
