
- •История 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

В большинстве случаев программы для Windows могут игнорировать все сообщения за исключением WM_CHAR.
Параметр lParam – такой же, как и параметр lParam аппаратного сообщения клавиатуры; Параметр wParam – это код символа ASCII;
Если Windows приложению необходимо обрабатывать символы клавиатуры, то ему придется обрабатывать сообщение WM_CHAR.
case WM_CHAR:
{char chCharCode = (char) wParam; // ASCII-код символа switch(chCharCode)
{
case ‘\b’: . . .; // введен символ Backspace break;
case ‘A’: . . .; // введен прописной символ A break;
case ‘a’: . . .; // введен строчныйо символ а break;
…
default: . . .; // введены другие символы break;
}
}; return 0;
Обработка сообщений от мыши
GetSystemMetrics, передав ей в качестве параметра значение SM_MOUSEPRESENT –
определение присутствие мыши: если мышь есть – возврат ненулевого значения.
GetSystemMetrics с параметром SM_CMOUSEBUTTONS - определение количества кнопок.
При перемещение мыши, Windows перемещает по экрану растровую картинку - курсор
мыши,
имеющий вершину (hot spot) размером в один пиксель, точно указывающий положение мыши на экране.
Действиям над кнопками мыши:
•Щелчок – нажатие и отпускание кнопки мыши.
•Двойной щелчок – двойное быстрое, идущее одно за другим, нажатие и отпускание кнопки мыши.
•Перетаскивание – перемещение мыши при нажатой кнопке.
Сообщения мыши могут быть связаны:
•с рабочей областью окна

Сообщения мыши, связанные с рабочей областью окна – это сообщения мыши,
получаемые оконной процедурой, когда мышь проходит через ее окно, и при щелчке внутри окна, даже если окно не активно или не имеет фокуса ввода.
В Windows для мыши определен набор из 21 сообщения. Однако 11 из этих сообщений не относятся к рабочей области, и программы для Windows обычно игнорируют их.
Сообщения, получаемые оконной процедурой:
•WM_MOUSEMOVE – о перемещении мыши по рабочей области окна;
•WM _LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN – о
нажатии кнопки мыши внутри рабочей области окна;
•WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP – об отпускании кнопки мыши внутри рабочей области окна;
•WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK
– о двойном щелчке кнопки мыши внутри рабочей области окна;
lParam – содержит положение мыши: младшее слово – это координата Х, а старшее – координата Y относительно верхнего левого угла рабочей области окна, извлекаемые с помощью макросов LOWORD и HIWORD.
wParam – показывает состояние кнопок мыши и клавиш <Shift> и <Ctrl>, проверяемый с помощью битовых масок, определенных в заголовочных файлах:
•MK_LBUTTON – левая кнопка нажата.
•MK_RBUTTON – правая кнопка нажата.
•MK_MBUTTON – средняя кнопка нажата.
•MK_SHIFT – клавиша <Shift> нажата.
•MK_CONTROL – клавиша <Ctrl> нажата.
!При движении мыши по рабочей области окна, Windows не вырабатывает сообщение WM_MOUSEMOVE для всех возможных положений мыши.
При щёлкании кнопкой мыши в рабочей области неактивного окна, Windows сделает активным окно, в котором был произведен щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN.
Оконная процедура может получить:
•сообщение WM_LBUTTONUP, не получив вначале сообщения WM_LBUTTONDOWN, если кнопка мыши нажимается в одном окне, мышь перемещается в другое окно, и кнопка отпускается.
•сообщение WM_LBUTTONDOWN без соответствующего ему сообщения WM_LBUTTONUP, если кнопка мыши отпускается во время нахождения мыши в другом окне.
!НО:
1.Оконная процедура может захватить мышь (capture the mouse) и продолжать получать сообщения мыши, даже если она находится вне рабочей области окна.
2.Если системное модальное окно сообщений или системное модальное окно диалога находится на экране, никакая другая программа не может получать сообщения от мыши.

Обработка нажатия клавиш <Shift> и <Ctrl> и кнопок мыши
При получении сообщений мыши, связанных с рабочей областью окна, через параметр wParam передается значение, позволяющее определить, были ли одновременно с этим нажаты кнопки мыши или клавиши <Shift> и <Ctrl> клавиатуры.
UINT fwKeys = wParam; // состояние кнопок мыши if(MK_SHIFT & fwKeys)
{
if(MK_CONTROL & fwKeys)
{ /* нажаты клавиши <Shift> и <Ctrl> */ } else
{/* нажата клавиша <Shift> */ }
}
else
if(MK_CONTROL & fwKeys)
{/* нажата клавиша <Ctrl> */ } else
{/* клавиши <Shift> и <Ctrl> не нажаты */ }
}
GetKeyState возвращает состояние:
1.кнопок мыши или клавиш <Shift> и <Ctrl>, используя виртуальные коды клавиш VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_SHIFT и VK_CONTROL.
2.кнопки мыши и клавиши в связи с обрабатываемым в данный момент сообщением, т.е. информация о состоянии должным образом синхронизируется с сообщением.
Двойные щелчки мыши
Двойной щелчок мыши – это два, следующих одно за другим в быстром темпе, щелчка мыши.
Чтобы оконная процедура получала сообщения двойного щелчка мыши, то следует включить идентификатор CS_DBLCLKS при задании стиля класса окна перед вызовом функции RegisterClass:
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
Тогда оконная процедура получает следующие сообщения:
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,VM_LBU TTONUP.
Если CS_DBLCLKS не включить в стиль окна, то оконная процедура получит сообщения о двух одинарных щелчках мыши в следующей последовательности:
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUT TONUP.

•с нерабочей областью окна
Сообщения мыши, связанные с нерабочей областью окна – это сообщения мыши,
которые Windows посылает оконной процедуре, связанные с нерабочей областью (нерабочая область включает в себя панель заголовка, меню, рамку окна и полосы прокрутки).
Нет необходимости обрабатывать сообщения мыши нерабочей области – их передают в DefWibdowProc, чтобы Windows могла выполнить системные функции.
Сообщения мыши нерабочей области почти полностью такие же, как и сообщения мыши рабочей области. В названия сообщений входят буквы NC, что означает нерабочая (nonclient) – WM_NCMOUSEMOVE – перемещение мыши внутри нерабочей области окна.
wParam – показывает зону нерабочей области, в которой произошло перемещение или щелчок. Его значение приравнивается одному из идентификаторов, начинающихся с HT, что означает тест попадания (hit-test).
lParam – содержит в младшем слове значение координаты X, а в старшем – Y, являющиеся координатами экрана, а не координатами рабочей области. Значения координат X и Y верхнего левого угла экрана равны 0.
Приложение может преобразовать экранные координаты в координаты рабочей области окна и наоборот с помощью функций Windows ScreenToClient и ClientToScreen – функции преобразования
Сообщение теста попадания.
Сообщение WM_NCHITTEST (тест попадания в нерабочую область) – это сообщение,
предшествующее всем остальным сообщениям мыши рабочей и нерабочей области.
lParam содержит значения X и Y экранных координат положения мыши. wParam не используется.
В приложениях Windows это сообщение обычно передается в DefWindowProc. В этом случае Windows использует сообщение WM_NCHITTEST для выработки всех остальных сообщений на основе положения мыши.
Для сообщений мыши нерабочей области возвращаемое значение функции DefWindowProc при обработке сообщения WM_NCHITTEST передается как параметр wParam в сообщении мыши.
Если функция DefWindowProc после обработки сообщения WM_NCHITTEST возвращает значение HTCLIENT, то Windows преобразует экранные координаты в координаты рабочей области и вырабатывает сообщение мыши рабочей области.
!Используя сообщение WM_NCHITTEST, приложение может полностью запретить работу с мышью в том или ином окне:
case WM_NCHITTEST:
return (LRESULT) HTNOWHERE;
Захват мыши
Захват мыши – с его помощью приложение может получать сообщения от мыши, когда курсор мыши находится вне окна.
SetCapture – функция захвата мыши, после чего Windows посылает все сообщения мыши в оконную процедуру того окна, чей дескриптор окна был передан в функцию SetCapture.