- •История 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
Кроме представленных членов у класса имеются 5 функций:
virtual void CCmdlll::Enable(BOOL bOn = TRUE) -
блокирует (bOn = FALSE) или разблокирует (ЬОп = TRUE) элемент интерфейса пользователя, ассоциированныйсэтойкомандой.
virtual void CCmdUI::SetCheck(int nCheck = 1) -
устанавливает элемент интерфейса пользователя в одно из возможных состояний в зависимости от значения передаваемого параметра: 0 — непомеченное, 1 — помеченное, 2 — неопределенное. Последнее состояние применимо только ккнопкампанелейинструментов.
virtual void CCmdUI::SetRadio(BOOL bOn = TRUE) -
блокирует (bOn = FALSE) или разблокирует (ЬОп = TRUE) группу переключателей.
virtual void CCmdUI::SetText(LPCTSTR IpszText) -
устанавливаеттекстдляданногоэлементаинтерфейсапользователя.
void CCmdUI::ContinueRouting() —
позволяет направить команду на обработку дальше по маршруту. Эта функция действует совместно с обработчиком команды ON_COMMAND_EX, который возвращает FALSE.
Практические аспекты использования перечисленных здесь возможностей будут рассмотрены при обсуждении вопросов организации интерфейса пользователя.
В заключение общего обзора принципов работы с сообщениями, заложенными в библиотеке классов MFC, и несколько забегая вперед, рассмотрим основные функции, которые предназначены для работы с сообщениями.
Функции для работы с сообщениями
Понимание работы с сообщениями крайне важно для написания правильных и эффективных программ для Windows. Поэтому рассмотрим те основные функции, которые вы можете (и должны) широко использовать:
static const MSG* CWnd::GetCurrentMessage() -
возвращает указатель на структуру MSG, которая содержит информацию о текущем сообщении. Может бытьвызванатолькоизобработчика, заданногомакросом ON_MESSAGE.
LRESULT CWnd::Default() -
служитдлявызоваоконнойпроцедуры, выполняемойпоумолчанию.
virtual BOOL CWnd::PreTranslateMessage(MSG *pMsg) -
используется классом CWinApp для фильтрации оконных сообщений до того, как они будут распределены функциями Windows TranslateMessage и DispatchMessage.
LRESULT CWnd::SendMessage( UlNTmsg,
WPARAM wPrm = 0,
LPARAM IPrm = 0) -
посылает сообщение в объект CWnd, непосредственно вызывая оконную процедуру, и не выходит из нее, пока танеобработаетсообщение.
BOOL CWnd::PostMessage( UINT msg,
WPARAM wPrm = 0,
LPARAM IPrm = 0) -
помещает сообщение в очередь приложения и заканчивает работу без ожидания его обработки. Из очереди сообщения извлекаются функциями Windows GetMessage или PeekMessage.
BOOL CWnd::SendNotifyMessage( UINT msg,
WPARAM wPrm = 0,
LPARAM IPrm = 0) -
посылает в окно определенное извещение. Если окно было создано текущим потоком, то функция для обработки извещения вызывает оконную процедуру и не завершается, пока оно не будет обработано. Если же окно было созданодругим потоком, то послав извещение в оконную процедуру, функция завершает своюработу.
UINT ::RegisterWindowMessage(LPCTSTR IpString) -
позволяет получить идентификатор (в диапазоне от ОхСООО до OxFFFF) нового уникального сообщения,
который может затем использоваться при вызовах функций SendMessage или PostMessage. В качестве параметра IpString она использует указатель на строку, определяющую имя сообщения. Эта функция должна использоваться для предотвращения возможных конфликтов в случае, когда нужно связать между собой два (или больше) приложения. Зарегистрированное сообщение действует до окончания сеанса работы Windows. Обработчик сообщения ассоциируется с ним посредством специального макроса ON_REGISTERED_MESSAGE, например, как показано ниже:
class CUserWnd : public CParentWnd
/ / { {AFX_MSG_MAP(CUserWnd)
afx_msg LRESULT OnSample(WPARAM wParam, LPARAM IParam); / / { {AFX_MSG_MAP DECLARE_MESSAGE_MAP()
} ;
UINT WM_SAMPLE = RegisterWindowMessage("MESSAGE_SAMPLE");
BEGIN_MESSAGE_MAP(CUserWnd, CParentWnd) // { (AB'X_MSG MAP (CUserWnd)
ON__REGISTERED_MESSAGE(WM_SAMPLE, OnSample) //}}AFX_MSG_MAP END MESSAGE MAP()
Наиболее |
интересными из перечисленных являются две функции: Send Message и Post Message |
(рис. 19): |
|
SendM |
WndProc |
essage |
|
> Цикл обработки сообщений
PostMe |
WndProc |
ssage |
|
Рис. 19. Посылка сообщений функциями SendMessage и PostMessage
Основная цель этих функций — посылка сообщения в окно своего или некоторого другого приложения. Но на этом их совпадения заканчиваются. Дело в том, что функция SendMessage явно вызывает процедуру того окна, которое ассоциировано с объектом, вызывающим ее, и не выходит из процедуры, пока та не обработает сообщение. Другими словами, выполнение программы не будет продолжено до тех пор, пока сообщение не будет обработано.
В отличие от нее, функция PostMessage не вызывает явно оконную процедуру, а посылает сообщение в очередь сообщений приложения, откуда оно выбирается с помощью функции GetMessage или PeekMessage. Выполнение самой функции PostMessage при этом завершается и работа приложения может быть продолжена.
Но от теории, пусть даже и очень важной, пора переходить к практике. Неоднократное упоминание классов оконных объектов (и даже некоторое знакомство с ними) — одной из важнейших составляющих библиотеки классов MFC, диктует необходимость их скорейшего рассмотрения.