
- •История 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
9.Послесозданияокнаонообязательнодолжнопоявитьсянаэкране? Чтонеобходимо сделатьдляотображенияокна?
10.Длячегослужитциклобработкисообщений? Откудаприложениеизвлекаеточередное сообщение? Какимобразомикемсообщениясоздаются?
11.Сколькоочередейсообщенийсуществует? Длякогопредназначенысообщения?
12.Какимобразомциклобработкисообщенийпрерывается, даваявозможностьприложению завершитьсвоюработу?
13.Ктообычнопосылаетсообщение(икакое), котороепрерываетциклобработки сообщений?
14.Еслидолжносделатьприложение, еслиононеобрабатываетнекотороесообщение?
15.Изкакихисточниковоконнаяпроцедураполучаетсообщения?
16.Какоесообщениеприходитокну, есличастьегорабочейобласти(иливсяона) требует перерисовки? Чтотакоенедействительнаяобласть?
17.Вкакихситуацияхрабочаяобластьможетстановитьсянедействительной?
18.СвызовакакойфункциидолжнаначинатьсяобработкасообщенияWM_PAINT? Вызовомкакойфункциионадолжназаканчиваться? Длячеговызываютсяэтифункции?
19.Какобычнореагируетстандартноеглавноеокноприложениянаполучениесообщенияо егоудалении? Чтоприэтомпроисходитсприложением?
20.Когдаприходитсообщениеобудаленииокна? Чтопроизойдет, еслиостальныеокна приложениябудутреагироватьнаэтосообщениетакже, какиглавноеокно?
Сообщения
Типы сообщений
•синхронные сообщения(queued) - сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризуются в цикле обработки сообщений.
Отправление: с помощью функции PostMessage – ставится в очередь и немедленно возвращает управление.
Получение: результат пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN). Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходимости плановой перерисовки (WM_PAINT) и сообщение о выходе из программы (WM_QUIT)
•асинхронные сообщения (nonqueued) – сообщения, передающиеся непосредственно окну, когда Windows вызывает оконную процедуру. Отправление: с помощью функции SendMessage – не ставится в очередь, оконная процедура вызывается непосредственно, а возврат управления только после обработки сообщения оконной процедурой.
Получение: во всех остальных случаях, не указанных в получении синхронных сообщений, часто являются результатом синхронных сообщений.
Сообщения не похожи на аппаратные прерывания. Во время обработки в оконной процедуре одного сообщения программа не может быть прервана другим сообщением. Только в том случае, если оконная процедура вызвала функцию, которая сама стала источником нового сообщения, то оконная процедура начнет обрабатывать это новое сообщение еще до того, как функция вернет управление программе.
Цикл обработки сообщений и оконная процедура работают не параллельно. Когда оконная процедура обрабатывает сообщение, то это результат вызова функции
DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.
Обработка клавиатурных сообщений
Синхронизация событий клавиатуры.
Основанная на сообщениях архитектура Windows идеальна для работы с клавиатурой:
1.приложение узнает о нажатиях клавиш посредством сообщений, которые посылаются оконной процедуре: нажимание и отпускание клавиш.
2.драйвер клавиатуры передает информацию о нажатии клавиш в Windows.
3.Windows сохраняет эту информацию (в виде сообщений) в системной очереди сообщений.
4.передача сообщения клавиатуры, по одному за раз, в очередь сообщений программы, содержащей окно, имеющее фокус ввода (input focus).
5.отправление программой сообщения соответствующей оконной процедуре (с
помощью функции DispatchMessage).
Для отражения различных событий клавиатуры Windows посылает программам восемь различных сообщений. Программы вполне могут игнорировать многие из них.
Игнорирование событий клавиатуры.
Приложению не обязательно реагировать на каждое получаемое от клавиатуры сообщение - Windows сама обрабатывает многие сообщения клавиатуры и извещает программу об эффекте, вызванном нажатием той или иной клавиши:
•В программах для Windows часто используются быстрые клавиши для быстрого доступа к часто употребляемым пунктам меню. Windows сама преобразует быстрые клавиши в командные сообщения меню, приложению не нужно этого делать явно.
•Окна диалога также имеют интерфейс клавиатуры, но обычно программам не нужно отслеживать клавиатурные события, когда активно окно диалога. Интерфейс клавиатуры обслуживается самой Windows, и Windows посылает сообщения программе о действиях, соответствующих нажимаемым клавишам.
Понятие фокуса ввода
Когда на клавиатуре нажата клавиша, только одна оконная процедура может получить сообщение об этом.

Окно, имеющее фокус ввода – это окно, которое получает это сообщение клавиатуры.
Окно, имеющее фокус ввода – это либо активное окно, либо дочернее окно активного окна.
Сами по себе дочерние окна никогда не могут быть активными. Если фокус ввода находится в дочернем окне, то активным является родительское окно этого дочернего окна.
Если активное окно минимизировано, то окна с фокусом ввода нет. Windows продолжает слать программе сообщения клавиатуры, но эти сообщения выглядят иначе, чем сообщения, направленные активным и еще не минимизированным окнам.
Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура может определить, когда окно имеет фокус ввода.
•WM_SETFOCUS - окно получило фокус ввода
•WM_KILLFOCUS – что окно потеряло фокус ввода
Вответ на эти сообщения функция окна не может запретить получение или потерю фокуса ввода, так как эти сообщения носят чисто информирующий характер.
GetFocus - позволяет узнать окно, владеющее фокусом ввода;
SetFocus – позволяет изменить окно, владеющее фокусом ввода;
Категории клавиатурных сообщений:
•аппаратные (keystrokes) – нажатие или опускание клавиш, генерирующих значок или клавиши переключения, функциональные, управления курсором и т.д.
•символьные (characters) – нажатие клавиш с использованием таких клавиш как <Ctrl>, <Shift> и <CapsLock> - сочетание даёт символ, например строчные и прописные буквы.
Аппаратные сообщения. Виды аппаратных сообщений:
•несистемные– это сообщения WM_KEYDOWN и WM_KEYUP
Несистемные сообщения WM_KEYDOWN и WM_KEYUP вырабатываются для клавиш, которые нажимаются и отпускаются без участия клавиши <Alt>. Приложение использует или не использует эти сообщения клавиатуры. Windows их проигнорирует.
•системные - это сообщения WM_SYSKEYDOWN и WM_SYSKEYUP
Системные аппаратные сообщения WM_SYSKEYDOWN и WM_SYSKEYUP
важны для Windows, а не для приложений. Эти сообщения обычно вырабатываются при нажатии клавиш в сочетании с клавишей <Alt>.
Программы обычно игнорируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP и передают их в функцию DefWindowProc.
case WM_SYSKEYDOWN:
MessageBox(hWnd,”Message WM_SYSKEYDOWN”,”Key”,MB_OK); return(DefWindowProc(hWnd,message,wParam,lParam));

Если не передать системные аппаратные сообщения в DefWindowProc. происходит запрет всех операций с клавишей <Alt> (команды меню, <Alt+Tab> и др.), когда окно программы имеет фокус ввода.
Аппаратные сообщения клавиатуры становятся в очередь. Приложение с помощью функции GetMessageTime получить время нажатия и отпускания клавиши относительно старта системы.
32-разрядная переменная lParam, передаваемая в оконную процедуру, состоит из шести полей:
•счетчик повторений - число нажатий клавиши;
•скан-код OEM (Original Equipment Manufacturer) - код клавиши, генерируемый аппаратурой компьютера;
•флаг расширенной клавиатуры - 1, если сообщение клавиатуры появилось в результате работы с дополнительными клавишами расширенной клавиатуры IBM;
•код контекста - 1, если нажата клавиша <Alt>;
•флаг предыдущего состояния клавиши - 0, если в предыдущем состоянии клавиша была отпущена, и 1, если в предыдущем состоянии она была нажата;
•флаг состояния клавиши - 0, если клавиша нажимается, и 1, если клавиша отпускается;
wParam – содержит виртуальный код клавиши.
Виртуальный код клавиши (virtual key code) - идентифицирует нажатую или отпущенную клавишу.
Коды виртуальных клавиш имеют символьные обозначения, определенные в заголовочных файлах Windows, и имеют префикс VK_.
Сообщения WM_SYSKEYDOWN и WM_SYSKEYUP адресованы Windows, и
приложению не всегда нужно их отслеживать. Если приложение обрабатывает сообщение WM_KEYDOWN, то сообщение WM_KEYUP оно обычно тоже игнорирует.
Определение состояния клавиш сдвига и клавиш-переключателей.
Параметры wParam и lParam аппаратных сообщений клавиатуры ничего не сообщают о состоянии клавиш сдвига (<Shift>, <Ctrl>, <Alt>) и клавиш-переключателей (<CapsLock>, <NumLock>, <ScrollLock>).
GetKeyState- функция, получающая состояние любой виртуальной клавиши:
1.Отражает состояние клавиатуры на момент, когда последнее сообщение от клавиатуры было выбрано из очереди.
2.Не позволяет получать информацию о клавиатуре независимо от обычных сообщений от клавиатуры - программе необходимо получить сообщение от клавиатуры до того, как GetKeyState сможет определить состояние клавиш.
Информация о текущем положении клавиши используется функция GetAsyncKeyState.
Символьные сообщения. Виды символьных сообщений:
•несистемные – WM_CHAR, WM_DEADCHAR;
•системные – WM_SYSCHAR, WM_SYSDEADCHAR;