- •История 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
SetWindowPos позволяет переводить окно как «наверх» (во втором параметре передается HWND_TOP), так и на «задний план» (во втором параметре передается
HWND_BOTTOM):
BOOL SetWindowPos(HWND hwnd, HWND hwndlnsertAfter, int x, int y, int ex, int cy, UINT fuFlags);
Переменные локального состояния ввода каждого потока включают в себя массив синхронного состояния клавиш, но все потоки совместно используют один массив асинхронного состояния клавиш. Эти массивы отражают состояние всех клавиш на данный момент.
Функция GetAsyncKeyState применяется для определения того, нажата ли сейчас
заданная клавиша :
SHORT GetAsyncKeyState(int nVirtKey);
Параметр nVirtKey задает код виртуальной клавиши, состояние которой нужно проверить. Старший бит результата определяет, нажата в данный момент клавиша (1) или нет (0).
Функция GetKeyState отличается от GetAsyncKeyState тем, что возвращает состояние клавиатуры на момент, когда из очереди потока извлечено последнее клавиатурное сообщение:
SHORT GetKeyState(int nVirtKey);
•Эту функцию можно вызвать в любой момент; ей все равно, какое окно в фокусе.
Управление курсором мыши
Мышь — это графическое устройство ввода информации с одной или более кнопками.
Определения терминов, соответствующих действиям над кнопками мыши: Щелчок — нажатие и отпускание кнопки мыши Двойной щелчок — двойное быстрое одно за другим нажатие и отпускание кнопки мыши
Перетаскивание — перемещение мыши при нажатой кнопке
Если мышь перемещается по рабочей области окна, оконная процедура получает сообщение WM_MOUSEMOVE. Если кнопка мыши нажимается или отпускается внутри рабочей области окна, оконная процедура получает следующие сообщения:
Кнопка Нажатие |
Отпускание |
Нажатие |
|
|
(Второй щелчок) |
Левая |
WM_LBUTTON |
WM_LBUTTO |
WM_LBUTTOND |
|
DOWN |
NUP |
BLCLK |
Средняя |
WM_MBUTTON |
WM_MBUTTO |
WM_MBUTTOND |
|
DOWN |
NUP |
BLCLK |
Правая |
WM_RBUTTON |
WM_RBUTTO |
WM_RBUTTOND |
|
DOWN |
NUP |
BLCLK |
В концепцию локального состояния ввода входит и управление состоянием курсора мыши. Поскольку мышь, как и клавиатура, должна быть доступна всем потокам, Win32 не
позволяет какому-то одному потоку монопольно распоряжаться курсором мыши, изменяя его форму или ограничивая область его перемещения.
Рассмотрим, как система управляет этим курсором.
•Один из аспектов управления курсором мыши заключается в его показе. Система скрывает курсор, когда он оказывается над окном, созданным потоком, вызвавшим ShowCursor(FALSE), и показывает его всякий раз, когда он располагается над окном, созданным другим потоком.
•Другой аспект управления курсором мыши — возможность ограничить его перемещение каким-либо прямоугольным участком. В 16-разрядной Windows это делают вызовом ClipCursor.
BOOL ClipCursor(CONST RECT *lprc);
Оконная процедура обычно получает сообщения мыши только тогда, когда курсор мыши находится в рабочей или в нерабочей области окна. Но программе может понадобиться получать сообщения мыши и тогда, когда курсор мыши находится вне окна. Если это так, то программа может произвести "захват" (capture) мыши.
Захватывая мышь (вызовом SetCapture), окно требует, чтобы все связанные с мышью сообщения RIT отправлял в виртуальную очередь ввода вызывающего потока, а из нее — установившему захват окну до тех пор, пока программа не вызовет
ReleaseCapture.
•Обычно приложение вызывает SetCapture, когда пользователь нажимает кнопку мыши. Но поток имеет право вызывать эту функцию, даже если нажатия не было. Если SetCapture вызывается при нажатой кнопке, захват действует для всей системы. Как только система определяет, что все кнопки мыши отпущены, RIT перестает направлять сообщения от мыши исключительно в виртуальную очередь ввода данного потока.
•Однако вызвавшему SetCapture потоку «кажется», что режим захвата мыши попрежнему действует. Всякий раз, когда курсор оказывается на любом из окон, созданных установившим захват потоком, сообщения от мыши направляются в окно, применительно к которому этот захват и установлен.
•Кроме того, если пользователь попытается активизировать окно, созданное другим потоком, система автоматически отправит установившему захват потоку сообщения о нажатии и отжатии кнопок мыши. Затем она изменит переменные локального состояния ввода потока, чтобы отразить тот факт, что поток более не работает в режиме захвата.
Последняя переменная локального состояния ввода, связанная с мышью, — форма курсора. Всякий раз, когда поток вызывает SetCursor для изменения формы курсора, переменные локального состояния ввода соответствующим образом обновляются.
Допустим, пользователь перемещает курсор мыши на окно Вашей программы, окно получает сообщение WM_SETCURSOR, и Вы вызываете SetCursor, чтобы преобразовать курсор в «песочные часы». Вызвав SetCursor, программа начинает выполнять какую-то длительную операцию. Далее пользователь уводит курсор из окна Вашей программы в окно другого приложения.
Чтобы один поток изменил форму курсора, пока другой занят длительной операцией, переменные локального состояния ввода не нужны.
Контрольные вопросы
1.На уровне чего рассматривается ввод в WIN32?
2.Что означает упорядоченный ввод? Что означает разупорядоченный ввод? В чем их отличие?
3.Как достигается разупорядочивание? Есть ли у потока своя очередь асинхронных сообщений и своя виртуальная очередь ввода?
4.Объясните принцип разделения потоками виртуальных очередей ввода. Какая функция дает возможность двум и более потокам использовать виртуальную очередь?
5.Что происходит с системой, если заставить все потоки использовать одну очередь сообщений?
6.В каком случае система неявно соединяет виртуальные очереди ввода нескольких потоков?
7.Какой стиль работы системы основан на концепции локального состояния ввода? Чем обладает поток в этом случае?
8.Перечислите управляющую информацию о состоянии ввода у клавиатуры и мыши.
9.В чем заключается принцип аппаратных сообщений? Перечислите эти сообщения.
10.Какие сообщения относятся к символьным? Когда они доставляются в оконную процедуру?
11.Куда направляется потоком необработанного ввода (RIT) в Win32 ввод с клавиатуры? Что происходит, когда поток вызывает GetMessage?
12.Что нужно, чтобы направить клавиатурный ввод в другое окно?
13.Что определяет оконная процедура, обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS?
14.Какая функция активизирует в системе окно верхнего уровня? Есть ли функция, дополняющая ее?
15.Назовите функции, которые переводят фокус между окнами и позволяют RIT перенаправить ввод в другой поток.
16.Существует и функция для определения того, нажата ли сейчас заданная клавиша? Если да, то какая ?
17.Что такое мышь? Какие действия ей соответствуют?
18.Каким образом система управляет курсором мыши?