- •История 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
Кроме того, можно воспользоваться содержимым поля itemData, которое равно значению параметра IpszText функции CStatusBarCtrl::SetText. Например, через этот параметр можно передать идентификатор изображения, которое должно быть нарисовано в данной области строки состояния, или идентификатор шрифта, которым будет написан текст, или какую-либо другую информацию.
В заключение нам осталось описать, как строка состояния обрабатывает команду ON_UPDATE_COMMAND_UI. Как обычно, обработчик этой команды вызывается во время цикла простоя последовательно для всех областей строки состояния. Доступными функциями класса CCmdUI, отвечающего за обработку, являются Enable и SetText, Первая из них блокирует или разблокирует соответствующую область. При этом надо иметь в виду, что у заблокированных областей выключается отображение текста. Вторая функция позволяет изменить текст, который выводится в текущей области. Следует помнить, что при выводе текста не происходит автоматического изменения размеров области.
На этом мы заканчиваем рассмотрение наиболее часто используемых панелей элементов управления —- панели инструментов и строки состояния — и переходим к описанию не менее интересного класса
CDialogBar,
Класс CDialogBar
Панель диалога — панель элементов управления с функциональными возможностями немодального блока диалога, которая содержит стандартные элементы управления Windows. Она действует подобно блоку диалога,поддерживая, в частности, перемещение между элементами при помощи клавиши <ТаЬ>. Кроме того, для нее, как и для блока диалога, используется шаблон диалога. Это с одной стороны. А с другой, ее можно рассматривать как более мощную панель инструментов. Извещения от элементов управления панели диалога посылаются ее родительскому окну точно так же, как и от кнопок панели инструментов.1 Основное их различие заключается в том, что панель диалога может содержать произвольные элементы управления, в то время как панель инструментов, стандартно, — только кнопки. Панель диалога наиболее часто используется в качестве дополнения к основному окну, и любые извещения, такие как BN_CLICKED или EN_CHANGE будут посланы ее родителю — главному окну приложения.
Класс CDialogBar имеет всего две основные функции: конструктор
CDialogBar::CDialogBar()
который создает объект этого класса, и функцию Create, как обычно, отвечающую за создание окна Windows и присоединение его к текущему объекту:
BOOL CDialogBar::Create( CWnd *pParentWnd, LPCTSTR IpszTemplateName, UINT nStyle,
UINT nID) и
BOOL CDialogBar::Create( CWnd *pParentWnd, UINT nIDTemplate, UINT nStyle, UlNTnID)
Функция имеет следующие параметры: pParentWnd — указатель на родительское окно (не может быть равен NULL); IpszTemplateName — указатель на строку, содержащую имя ресурса шаблона панели диалога; второй вариант функции вместо имени использует идентификатор ресурса nIDTemplate; nID — идентификатор панели диалога; nStyle — стиль выравнивания панели диалога:
CBRS_TOP CBRS_BOTTOM CBRS_LEFT CBRS_RIGHT
панель диалога располагается у верхней стороны фрейма панель диалога располагается у нижней стороны фрейма панель диалога располагается у левой стороны фрейма панель диалога располагается у правой стороны фрейма
CBRS_NOALIGN панель диалога не меняет своего расположения, когда у родительскогоокнаизменяется размер
Эта функция (в любом варианте) загружает шаблон диалога из ресурса, заданного параметром IpszTemplateName или nIDTemplate, создает окно панели диалога, устанавливает его стиль и ассоциирует с объектом CDialogBar. Если определен стиль CBRS_TOP или CBRS_BOTTOM, то ширина панели определяется шириной фрейма, а высота берется из шаблона nIDTemplate. Если же определен стиль
CBRS_LEFT или CBRS_RIGHT, то высота панели определяется высотой фрейма, а ширина берется из шаблона nIDTemplate.
Все остальные функциональные возможности этот класс получает от своего базовогоCControlBar.
ControlBars — пример приложения
Как известно, лучше один раз увидеть, чем сто раз услышать. Перейдем к примеру использования, конечно не всех, но хотя бы части заявленных возможностей. Сначала несколько слов о составе примера. Весь код приложения, окно которого представлено на рис. 27, занимает более 800 строк, не считая добавленных нами комментариев, плюс еще три файла для хранения битовых массивов панелей инструментов и файл пиктограммы приложения. Мы офаничились лишь двумя файлами исходного текста на C++ — этого больше чем достаточно.
Все функции с префиксом OnUpdate используются во время простоя, т. е. в момент, когда очередь сообщений потока пуста. Все такие функции расположены в объявлении класса за функциями обработки команд или событий, и позволяют воздействовать на соответствующие им элементы управления.
В главное окно приложения помещены следующие панели элементов управления:
Q панель инструментов (команд) — привязанная к верхней части окна без возможности перемещения. В нее вставлен комбинированный список для задания стиля выравнивания (обработчик его сообщений — функция Create Tool Bar), выбор элемента которого отслеживается функцией OnStyle;
Q панель инструментов рисования — плавающая с возможностью привязки. Все кнопки имеют кроме рисунка еще и текст (функция Create Pane Bar). Выбор одного из инструментов сопровождается вызовом функции OnPane;
Q панель диалога — привязанная к левой части окна без возможности перемещения. Содержит элементы управления: статическая рамка, два флажка для отображения/скрытия панели инструментов (команд)1 и панели инструментов рисования (функция OnViewPane), и, наконец, комбинированный список отображения/выбора инструмента рисования, выбор элемента которого отслеживается функцией
OnSelChangePane;
Идентификатор команды для управления режимом показа панели инструментов (команд) равен ID_V1EW_TOOLBAR, который интерпретируется как команда и равляет панелями с идентификатором AFX_IDW TOOLBAR, так что специального кода создавать не надо — все делает библиотека классов MFC.
Q строка состояния — состоящая из четырех областей: для подсказки, отображения режима NUMLOCK, для демонстрации обработки во время простоя (функция On UpdateIndicatorldle) и для отображения текущего времени примерно раз в секунду по сигналу от таймера (функция OnTimer).
Осталось рассмотреть меню, в котором имеются, кроме общих, следующие пункты:
Qменю "Вид" — управляет отображением/скрытием панелей управления (кроме панели диалога) и строкой состояния;'
Qменю "Стиль" — управляет выбором стиля выравнивания. Используется, как и в случае панели инструментов (команд), функция OnStyle;
Оменю "Инструмент" — обеспечивает задание количества столбцов для отображения панели инструментов рисования (функции CPane2colomn и CPaneScolomn),
