Общие замечания

В MFC реализовано два класса, предназначенных для создания статусных строк. Класс CStatusBarCtrl является «тонкой» оболочкой элемента управления общего назначения Status Bar, имеющего оконный класс «msctls_statusbar32». Класс CStatusBar представляет собой «надстройку» над CStatusBarCtrl и реализует высокоуровневую поддержку для отображения подсказок к командам меню и кнопкам панели инструментов, а также состояния клавиш Caps Lock, Num Lock и Scroll Lock. Как правило, в главное окно MFC-приложения вставляется именно объект класса CStatusBar.

Класс CStatusBarCtrl

Заголовочный файл #include <afxcmn.h>
Непосредственный предок класс CWnd
Объектная модель DYNAMIC

Конструирование (construction)

CStatusBarCtrl(void);
BOOL Create(
   DWORD fdwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT uID
);

Параметр fdwStyle определяет стиль создаваемого окна. Необходимо обязательно указывать стили WS_CHILD и WS_VISIBLE. Помимо этого можно использовать следующие стили:

CCS_BOTTOM
«Прижать» создаваемое окно к нижней границе клиентской области окна-родителя.
CCS_TOP
«Прижать» создаваемое окно к верхней границе клиентской области окна-родителя.
SBARS_SIZEGRIP
На правом краю статусной строки будет отображаться «рифленый уголок», позволяющий изменять размеры окна-родителя с помощью мышки. Этот стиль нельзя использовать совместно со стилем CCS_TOP.

Через параметр rect необходимо передать размеры создаваемого окна; параметр pParentWnd должен определять родительское окно (как правило, им является главное окно приложения) и не может быть равен NULL. Наконец, через параметр uID передается идентификатор создаваемого окна (как правило, он назначается равным AFX_IDW_STATUS_BAR).

Атрибуты (attributes)

Статусная строка может работать в двух режимах: стандартном и упрощенном. При работе в стандартном режиме она может быть разделена на несколько (не более 255) областей, в каждой из которых может выводиться какой-то текст. В упрощенном режиме статусная строка представляет собой одну единственную область.

BOOL SetSimple(
   BOOL fSimple = TRUE
);

Переводит статусную строку в упрощенный (при fSimple равном TRUE) или стандартный (при fSimple равном FALSE) режим работы. Возвращает TRUE, если требуемый режим был успешно установлен и FALSE — в противном случае.

BOOL IsSimple(void) const;

Возвращает TRUE, если статусная строка находится в упрощенном режиме, и FALSE — если в стандартном.

BOOL SetParts(
   int nNumParts,
   int* pnEdges
);

Разбивает статусную строку на nNumParts областей. Параметр pnEdges должен быть адресом массива, содержащего правые границы областей относительно левого края статусной строки. Последний элемент этого массива можно задать равным -1; в этом случае правая граница данной области будет всегда совпадать с правой границей статусной строки.

int GetParts(
   int nNumParts,
   int* pnDest
);

Записывает в массив по адресу pnDest правые границы областей, на которые разделена статусная строка и возвращает количество записанных элементов. Параметр nNumParts должен задавать емкость этого массива. Заметим, что если задать pnDest равным NULL, то метод вернет текущее количество областей.

BOOL SetText(
   LPCTSTR pszText,
   int nPane,
   int nStyle
);

Назначает текст и стиль области с индексом nPane (при работе в стандартном режиме этот параметр должен иметь значение от 0 до 254, а при работе в упрощенном — 255). В качестве стиля, определяющего внешний вид области, можно указывать одно из следующих значений:

0
Область рисуется вдавленной.
SBT_NOBORDERS
Область рисуется плоской.
SBT_POPOUT
Область рисуется выпуклой.
SBT_OWNERDRAW
Область целиком рисуется родительским окном.
int GetText(
   LPTSTR pszDest,
   int nPane,
   int* pnStyle
) const;

Копирует текст области с индексом nPane в буфер по адресу pszDest, а ее стиль — в переменную, адресуемую параметром pnStyle. Возвращает длину скопированного текста.

int GetTextLength(
   int nPane,
   int* pnStyle
) const;

Возвращает длину текста в области с индексом nPane и записывает в переменную по адресу pnStyle ее стиль.

BOOL GetBorders(
   int& nHorz,
   int& nVert,
   int& nSpacing
) const;
BOOL GetBorders(
   int* pnDest
) const;

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

void SetMinHeight(
   int nHeight
);

Метод позволяет назначить высоту той части статусной строки, которая используется для вывода текста. Значение nHeight указывается в пикселях.

BOOL GetRect(
   int nPane,
   RECT* prcDest
) const;

Метод записывает в структуру по адресу prcDest границы области с индексом nPane относительно клиентской области статусной строки.

void SetTipText(
   int nPane,
   LPCTSTR pszText
);

Назначает текст всплывающей подсказки для области с индексом nPane в соответствии со строкой pszText.

CString GetTipText(
   int nPane
) const;

Возвращает текст всплывающей подсказки для области с индексом nPane.

COLORREF SetBkColor(
   COLORREF crColor
);

Назначает цвет фона, на котором выводится текст в статусной сроке, и возвращает предыдущее значение. Для установки стандартного системного цвета параметр crColor можно задать равным CLR_DEFAULT.

BOOL SetIcon(
   int nPane,
   HICON hIcon
);

Позволяет назначить иконку, которая будет отображаться в области с индексом nPane (при работе в стандартном режиме этот параметр должен иметь значение от 0 до 254, а при работе в упрощенном -1). Чтобы удалить иконку параметр hIcon необходимо задать равным NULL.

Виртуальные методы (overridables)

virtual void DrawItem(
   DRAWITEMSTRUCT* lpDIS
);

Данный метод вызывается для отрисовки каждой области, которой был назначен стиль SBT_OWNERDRAW. Через параметр lpDIS в него передается указатель на структуру, содержащую параметры отрисовки. В данном случае, действительные значения будут иметь следующие поля:

UINT CtlID
Идентификатор окна статусной стоки.
UINT itemID
Индекс области, которую необходимо отрисовать.
HWND hwndItem
Дескриптор окна статусной стоки.
HDC hDC
Контекст устройства вывода, который необходимо использовать при отрисовке.
RECT rcItem
Границы рисуемой области.
DWORD itemData
Содержит 4-байтовое значение, которое было указано в параметре pszText при последнем вызове метода SetText.

Класс CStatusBar

Заголовочный файл #include <afxext.h>
Непосредственный предок класс CControlBar
Объектная модель DYNAMIC

Конструирование (construction)

CStatusBar(void);
BOOL Create(
   CWnd* pParentWnd,
   DWORD fdwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
   UINT uID = AFX_IDW_STATUS_BAR
);

Параметр pParentWnd должен определять родительское окно (как правило, им является главное окно приложения) и не может быть равен NULL. Помимо обязательных WS_CHILD и WS_VISIBLE, при формировании параметра fdwStyle можно использовать следующие стили:

CBRS_BOTTOM
«Прижать» создаваемое окно к нижней границе клиентской области окна-родителя.
CBRS_TOP
«Прижать» создаваемое окно к верхней границе клиентской области окна-родителя.
CBRS_NOALIGN
Запретить автоматическое выравнивание при изменении размеров окна-родителя.

И наконец, через параметр uID передается идентификатор создаваемого окна. Если окно статусной строки должно иметь какие-либо стили, свойственные элементу управления Status Bar, то для его создания можно воспользоваться методом

BOOL CreateEx(
   CWnd* pParentWnd,
   DWORD fdwCtrlStyle = 0,
   DWORD fdwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
   UINT uID = AFX_IDW_STATUS_BAR
);

С помощью параметра fdwCtrlStyle можно задать следующие стили:

SBARS_SIZEGRIP
На правом краю статусной строки будет отображаться «рифленый уголок», позволяющий изменять размеры окна-родителя с помощью мышки.
SBT_TOOLTIPS
Отображать всплывающие подсказки.

Инициализация (initialization)

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

  1. Добавить в ресурс String Table строку, содержащую текст индикатора.
  2. В окно-родитель статусной строки добавить обработчик типа UPDATE_COMMAND_UI, указав в качестве идентификатора команды идентификатор добавленной строки.
  3. В этом обработчике использовать метод Enable объекта CCmdUI, передавая ему TRUE для показа и FALSE — для сокрытия соответствующей строки.

Создание индикаторов и разбиение статусной строки на области выполняется с помощью метода

BOOL SetIndicators(
   const UINT* puStrIDs,
   UINT uCount
);

Параметр puStrIDs должен адресовать массив, содержащий идентификаторы строк, используемых в качестве текста индикаторов. Через параметр uCount необходимо передать количество элементов в этом массиве. Первый элемент этого массива, как правило, имеет значение ID_SEPARATOR, при этом строка с таким идентификатором в String Table не добавляется. В созданную таким образом «нулевую» область статусной строки ядро MFC выводит текст подсказки к выделенному элементу меню, а ее минимально допустимая ширина назначается равной ¼ ширины экрана.

Ниже приведены идентификаторы стандартных для MFC индикаторов, которые обрабатываются самой библиотекой и позволяют отображать состояние некоторых клавиш:

идентификаторклавиша
ID_INDICATOR_NUMNum Lock
ID_INDICATOR_CAPSCaps Lock
ID_INDICATOR_SCRLScroll Lock

Операции (operations)

int CommandToIndex(
   UINT uStrID
) const;

Возвращает индекс области, занимаемой индикатором, по идентификатору строки с его текстом.

UINT GetItemID(
   int nPane
) const;

Возвращает идентификатор строки с текстом индикатора, расположенного в области с индексом nPane.

void GetItemRect(
   int nPane,
   RECT* prcDest
) const;

Записывает в структуру по адресу prcDest границы области с индексом nPane относительно клиентской области окна статусной строки.

void SetPaneInfo(
   int nPane,
   UINT uStrID,
   UINT fuStyle,
   int cxWidth
);

Позволяет назначить идентификатор, стиль и ширину в пикселях области с индексом nPane. Для формирования параметра fuStyle можно использовать следующие флажки:

SBPS_NORMAL
Область рисуется вдавленной.
SBPS_NOBORDERS
Область рисуется плоской.
SBPS_POPOUT
Область рисуется выпуклой.
SBPS_DISABLED
Текст данной области не выводится.
SBPS_STRETCH
Область будет занимать все свободное пространство статусной строки. Может быть только одна область, имеющая такой стиль.
void GetPaneInfo(
   int nPane,
   UINT& uStrID,
   UINT& fuStyle,
   int& cxWidth
) const;

Записывает идентификатор, стиль и ширину области с индексом nPane в соответствующие переменные.

void SetPaneStyle(
   int nPane,
   UINT fuStyle
);

Назначает стиль области с индексом nPane.

UINT GetPaneStyle(
   int nPane
) const;

Возвращает стиль области с индексом nPane.

BOOL SetPaneText(
   int nPane,
   LPCTSTR pszText,
   BOOL fUpdate = TRUE
);

Задает текст для отображения в области с индексом nPane. Заметим, что назначение текста для «нулевой» области статусной строки (имеющей по умолчанию идентификатор ID_SEPARATOR и используемой для отображения подсказок к выделенным элементам меню), а также для областей-индикаторов не дает никакого результата. Создать область для отображения произвольного текста можно, указав при вызове метода SetIndicators два элемента ID_SEPARATOR.

CString GetPaneText(
   int nPane
) const;
void GetPaneText(
   int nPane,
   CString& strDest
) const;

Первый вариант метода возвращает, а второй — копирует в strDest текст из области с индексом nPane.

CStatusBarCtrl& GetStatusBarCtrl(void) const;

Возвращает ссылку на объект класса CStatusBarCtrl, соответствующий данной статусной строке. Эта ссылка может быть использована для «низкоуровневого» доступа к статусной строке, например, для назначения высоты той части статусной строки, которая используется для вывода текста с помощью метода SetMinHeight.

Виртуальные методы (overridables)

virtual void DrawItem(
   DRAWITEMSTRUCT* lpDIS
);

Данный метод вызывается для прорисовки каждой области, которой был назначен стиль SBT_OWNERDRAW. Через параметр lpDIS в него передается указатель на структуру, содержащую параметры прорисовки (см. описание одноименного метода в классе CStatusBarCtrl).

обновлено
29.03.2006
 
Проверка PR и ТИЦ