- •История 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
Пока мышь захвачена, системные функции клавиатуры тоже не действуют. Сообщения мыши в захваченном состоянии - сообщениями рабочей области.
ReleaseCapture – функция освобождения мыши, т.е. возврат обработки мыши в нормальный режим.
Сообщения таймера
Таймер – это устройством ввода информации, которое периодически извещает приложение о том, что истек заданный интервал времени.
Приложение сообщает системе Windows интервал времени, а затем Windows периодически посылает приложению сообщения WM_TIMER, сигнализируя об истечении интервала времени.
Применение таймера:
•Режим автосохранения – таймер может предложить программе сохранять работу пользователя на диске всегда, когда истекает заданный интервал времени.
•Поддержка обновления информации о состоянии – программа может использовать таймер для вывода на экран обновляемой в реальном времени, постоянно меняющейся информации, связанной либо с системными ресурсами, либо с процессом выполнения отдельной задачи.
•Завершение демонстрационных версий программ – некоторые демонстрационные версии программ рассчитаны на свое завершение через какое-либо заданное время после запуска. Таймер может сигнализировать таким приложениям, когда их время истекает.
•Эмуляция многозадачности –хотя Windows является вытесняющей многозадачной средой, иногда самое эффективное решение для программы – как можно быстрее вернуть управление Windows. Если программа должна выполнять большой объем работы, она может разделить задачу на части и обрабатывать каждую часть при получении сообщения от таймера.
•Задание темпа изменения – графические объекты в играх или окна с результатами в обучающих программах могут нуждаться в задании установленного темпа изменения.
Сообщения от таймера
SetTimer – функция, присоединяющая таймер к программе, содержащая параметр, задающий интервал в миллисекундах – это значение определяет темп, с которым Windows посылает программе сообщения WM_TIMER.
KillTimer – функция для остановки потока сообщений от таймера, очищает очередь сообщений от всех необработанных сообщений WM_TIMER.
Приложения Windows получают сообщения WM_TIMER из обычной очереди сообщений, т.е. работа приложения не будет прервана внезапным сообщением WM_TIMER.
Таймер похож на клавиатуру и мышь: драйвер обрабатывает асинхронные аппаратные прерывания, а Windows преобразует эти прерывания в регулярные, структурированные, последовательные сообщения.
WM_TIMER имеет низкий приоритет, и программа получит его, только если в очереди нет других сообщений. Windows не хранит в очереди сообщений несколько сообщений WM_TIMER. Вместо этого Windows объединяет несколько сообщений WM_TIMER из очереди в одно сообщение.
Использование таймера:
•Посылка сообщения WM_TIMER обычной оконной процедуре приложения. SetTimer(hWnd,1,1000,NULL);
1.Первый параметр – дескриптор того окна, чья оконная процедура будет получать сообщения WM_TIMER.
2.Второй параметр - идентификатор таймера, значение которого должно быть отлично от нуля.
3.Третий параметр – это 32-разрядное беззнаковое целое, которое задает интервал в миллисекундах
KillTimer(hWnd,1); остановка потока сообщений WM_TIMER
При получении сообщения WM_TIMER, wParam равно значению идентификатора таймера,
а lParam равно 0.
!Если приложению необходимо несколько таймеров, для каждого из них необходимо использовать свой идентификатор:
#define TIMER_SEC 1 #define TIMER_MIN 2
...
SetTimer(hWnd, TIMER_SEC,1000,NULL);
SetTimer(hWnd, TIMER_MIN,60000,NULL);
Для того чтобы установить новое время срабатывания для существующего таймера, следует уничтожить таймер функций KillTimer и снова установить его функцией
SetTimer.
•Пересылка сообщения WM_TIMER другой функции этого же приложения (способ 1).
SetTimer(hWnd,1,1000,(TIMERPROC)TimerProc); - четвертый параметр функции
SetTimer заменился адресом функции обратного вызова (в отличие от 1 способа)
Функцией обратного вызова – это функция, которая будет получать эти таймерные сообщения, вызываемая Windows. Приложение сообщает Windows адрес этой функции, а позже Windows вызывает ее (оконная процедура фактически является такой функцией обратного вызова).
Определение функции обратного вызова: как CALLBACK
void CALLBACK TimerProc(HWND hWnd,UINT iMsg,UINT iTimerID,DWORD dwTime)
{
// обработка сообщений WM_TIMER
. . .
}
Входными параметрами те же, что и параметры оконной процедуры:
1.hWnd – дескриптор окна, задаваемый при вызове функции SetTimer.
2.iMsg всегда будет равен WM_TIMER.
3.iTimerID – это идентификатор таймера.
4.dwTime – системное время.
Таймерная функция обратного вызова, в данном случае TimerProc, не имеет возвращаемого в Windows значения.
•Пересылка сообщения WM_TIMER другой функции этого же приложения (способ 2).
UINT iTimerID=SetTimer(NULL,0,1000,(TIMERPROC)TimerProc);
1.hWnd устанавливается NULL
2.идентификатор таймера игнорируется
Функция возвращает ID таймера (возвращаемое функцией значение будет равно NULL, если таймер недоступен).
KillTimer(NULL, iTimerID); остановка потока сообщений WM_TIMER
Контрольные вопросы
1.Что такое синхронные и асинхронные сообщения?
2.Что такое фокус ввода? Как он связан с понятием активного окна?
3.Может ли приложение, обрабатывающее сообщения WM_SETFOCUS и WM_KILLFOCUS повлиять на приобретение или потерю фокуса ввода окном?
4.Когда в окно поступают аппаратные сообщения клавиатуры, какие типы аппаратных сообщений существуют?
5.Какие сообщения Windows являются аппаратными клавиатурными сообщениями?
6.В чем специфика обработки системных аппаратных клавиатурных сообщений?
7.Что такое виртуальный код клавиши? Что он идентифицирует?
8.Как приложение может получить информацию о нажатии на определенную клавишу на момент, когда последнее сообщение от клавиатуры было выбрано из очереди?
9.Как приложение может получить информацию о нажатии на определенную клавишу в текущий момент времени?
10.Как следует модифицировать цикл обработки сообщений для того, чтобы приложение могло получать символьные сообщения?
11.Какое сообщение является символьным клавиатурным сообщением и какую дополнительную информацию оно несет с собой?
12.Какие наборы символов использует Windows, чем они отличаются и где применяются?
13.Как можно определить наличие мыши и ее характеристики?
14.Чем является курсор мыши, что такое вершина курсора мыши?
15.Какие сообщения могут поступать приложению при работе пользователя с мышью?
16.От чего зависит количество сообщений WM_MOUSEMOVE, которые получает окно приложения?
