![](/user_photo/1549_7W_y5.jpg)
- •История Windows
- •Windows 1.0
- •Windows 1.3
- •Windows 2.0
- •Windows 3.0
- •Windows 3.1
- •Windows for Workgroups версии 3.11
- •Windows NT
- •Windows 95
- •Windows NT Workstation 4.0 и Windows NT Server 4.0
- •Windows NT 4.0 Server Enterprise Edition
- •Windows 98
- •Windows 98 Second Edition (SE)
- •Windows 2000
- •Windows 98 Millenium Edition (ME)
- •Windows XP
- •Общая архитектура WINDOWS приложения.
- •Каркас приложения
- •Регистрация класса окна
- •Создание окна.
- •Отображение окна.
- •Цикл обработки очереди сообщений.
- •WndProc
- •Обработка сообщений типового приложения.
- •Контрольные вопросы
- •Сообщения
- •Типы сообщений
- •Обработка клавиатурных сообщений
- •Обработка сообщений от мыши
- •Сообщения таймера
- •Контрольные вопросы
- •Организация ввода
- •Разупорядоченный ввод
- •Разделение потоками виртуальных очередей ввода
- •Локальное состояние ввода
- •Ввод с клавиатуры и фокус
- •Управление курсором мыши
- •Контрольные вопросы
- •Окна
- •Окна Windows
- •Иерархия окон
- •Оконная процедура, стандартные оконные процедуры
- •Стиль класса окна
- •Стили окон, окна основных стилей
- •Перекрывающиеся окна
- •Временные окна
- •Дочерние окна
- •Сообщения управления окнами
- •Окна с полосами прокрутки
- •Системные метрики
- •Определение размера окна
- •Определение расположения окна
- •Контрольные вопросы
- •Графический интерфейс устройств(GDI).
- •Создание (получение) контекста устройств.
- •Сохранение контекста устройства.
- •Прямые (отрезки) и кривые
- •Закрашенные области
- •Битовые шаблоны (растровые шаблоны, растровые образы)
- •Текст и шрифты
- •Режимы масштабирования и преобразования
- •Метафайл
- •Регионы
- •Путь
- •Палитры
- •Контрольные вопросы
- •Объекты ядра
- •Что такое объект ядра
- •Учет пользователей объектов ядра
- •Защита
- •Таблица описателей объектов ядра
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Именованные объекты
- •Дублирование описателей объектов
- •Изменение флагов описателя
- •Синхронизация потоков
- •Критическая секция
- •Мьютексы
- •Семафоры
- •События
- •Ожидаемые таймеры
- •Контрольные вопросы
- •Ресурсы Windows приложения
- •Файлы ресурсов приложения
- •Значки (пиктограммы)
- •Курсоры
- •Битовые образы
- •Символьные строки
- •Ресурсы, определяемые пользователем
- •Таблица акселераторов
- •Меню
- •Диалоговые окна
- •Контрольные вопросы
- •Элементы управления
- •Дочерние окна управления
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Дочерние окна и фокус ввода
- •Дочерние окна управления и цвет
- •Кнопки различных стилей (класс BUTTON)
- •Нажимаемые кнопки
- •Флажки-переключатели
- •Переключатели
- •Окна групп
- •Кнопки, определяемые пользователем
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Списки разных стилей (класс listbox)
- •Комбинированные списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Контрольные вопросы
- •Расширенные элементы управления
- •Основы общих элементов управления
- •Инициализация библиотеки элементов общего пользования
- •Создание элементов управления общего пользования
- •Посылка сообщений общим элементам управления
- •Уведомляющие сообщения от общих элементов управления
- •Контрольные вопросы
- •Стандартные диалоговые окна.
- •Окна сообщений
- •Диалоговые окна общего пользования
- •Контрольные вопросы
- •Динамически подключаемые библиотеки
- •Создание DLL
- •Проецирование DLL на адресное пространство процесса
- •Функция входа/выхода
- •Функция DllMain и стандартная библиотека С
- •Функция LibEntry
- •Функция LibMain
- •Функция WEP
- •Экспорт функций и переменных из DLL
- •Импорт функций и переменных из DLL
- •Заголовочный файл DLL
- •Разделы в ЕХЕ- и DLL-файлах
- •Контрольные вопросы
- •Файлы, проецируемые в память
- •Контрольные вопросы
- •Классы, определяющие архитектуру приложения
- •Классы приложения и поддержки потоков
- •Классы приложения и потоков
- •Классы фреймов окон
- •Получение информации о приложении
- •Соглашения об именах MFC
- •Включаемые файлы
- •Функция WinMain
- •Класс CWinApp
- •Класс CWnd
- •Класс CFrameWnd
- •Создание главного окна SDI-приложения
- •Примечание
- •Создание главного окна SDI-приложения
- •Создание дочерних окон
- •Ограничение размеров окна
- •Ограничение доступа к окну
- •Создание многодокументных приложений
- •Класс CMDIChildWnd
- •MDI — пример приложения
- •Категории сообщений
- •Карта сообщений
- •Компоненты карты сообщений
- •Класс CCmdTarget
- •Стандартный маршрут команды
- •Команды обновления и класс CCmdlll
- •Функции для работы с сообщениями
- •Основные положения
- •Класс CDocTemplate
- •Класс CSingleDocTemplate
- •Роль фреймов в архитектуре "документ/представление"
- •Документ и его представления
- •Документы
- •Класс CDocument
- •Класс CArchive
- •Представления
- •Класс CView
- •Панели элементов управления
- •Класс CStatusBar
- •Класс CStatusBarCtrl
- •Класс CDialogBar
- •ControlBars — пример приложения
- •НЕКОТОРЫЕ КЛАССЫ MFC
- •Класс CObject - основной класс MFC
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс CPoint - точка на плоскости
- •Класс CSize - относительные координаты
- •Класс CString - текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы - шаблон CArray
- •Списки - шаблон CList
- •Словари - шаблон CMap
- •Класс CTime - дата и время
- •Файловая система - класс CFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система - классы CMemFile и CStdioFile
- •Модификация класса CMemFile
- •Файловая система - класс CStdioFile
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Исключения - класс CException
- •Класс CException
- •Класс CMemoryException
- •Класс CFileException
- •Приложение Except
- •Класс CArchiveException
- •Класс CNotSupportedException
- •Класс CResourceException
- •Класс CUserException
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.