- •Часть II. Проектирование пользовательских интерфейсов средствами win32 api п 1. Основы приложений для Windows. П 1.1 Типы данных Windows.
- •П. 1.2 Главная функция приложения WinMain().
- •П. 1.3 Оконная функция.
- •П. 1.4 Сообщения от окна
- •П. 1.5 Сообщения от мыши
- •1.5.1 Сообщения мыши, связанные с рабочей областью окна
- •1.5.3 Двойные щелчки мыши
- •1.5.4 Сообщения мыши, связанные с нерабочей областью окна
- •1.5.5 Захват мыши
- •П. 1.6 Сообщения от клавиатуры
- •1.6.1 Синхронизация событий клавиатуры
- •1.6.2 Игнорирование событий клавиатуры
- •1.6.3 Понятие фокуса ввода
- •1.6.4 Категории клавиатурных сообщений
- •1.6.5 Аппаратные сообщения
- •1.6.6 Символьные сообщения
- •П. 1.7 Таймеры Windows и служба времени.
- •П. 1.8 Классы окон
- •1.8.1. Описание используемых классом окон ресурсов
- •1.8.2. Регистрация класса окон
- •1.8.3. Создание окон
- •1.8.4. Стили окна
- •П. 1.9 Цикл обработки сообщений
- •П. 1.10 Структура текста приложения
- •П. 1.11 Вспомогательные функции создания окон
- •1.11.1 Функции отображения и перерисовки окон
- •1.11.2 Функции поиска и определения состояния окон
- •1.11.3 Функции перемещения окон
- •1.11.4 Сообщения приложения для пользователя
- •П. 1.12 Примеры создания окон
- •П 2. Органы управления
- •П 2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •П 2.2. Статический орган управления
- •П 2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •П 2.4 Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •П 2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •П. 2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •П 3. Вывод в окно
- •П. 3.1. Виды контекста отображения
- •П 3.2. Сообщение wm_paint
- •П 3.3. Установка атрибутов контекста отображения для текста
- •П 3.4. Вывод текста
- •3.4.1. Настройка параметров шрифта
- •3.4.2. Выбор шрифта в контекст отображения
- •3.4.3. Функции вывода текста
- •3.4.4. Определение метрик шрифта
- •П 3.5. Рисование геометрических фигур
- •3.5.1 Установка атрибутов контекста отображения для рисования.
- •3.5.1. Функции рисования точки
- •3.5.2. Функции рисования линий
- •3.5.3. Функции рисования замкнутых фигур
- •3.5.4 Функции создания и рисования регионов
- •П. 4 Ресурсы приложения и их использование. П. 4.1 Файл ресурсов.
- •П 4.2 Главное меню
- •П. 4.2.1 Элементы меню
- •П. 4.2.2 Создание меню
- •П. 4.2.3 Сообщения от меню
- •П. 4.3. Плавающее меню
- •П. 4.4. Акселераторы
- •П. 4.5. Панель инструментов
- •4.5.1. Создание панели инструментов
- •4.5.2. Управление состоянием кнопок панели
- •4.5.3. Вывод подсказок в панели инструментов
- •П. 4.6. Строка состояния
- •4.6.1. Создание строки состояния
- •4.6.2. Сообщения о меню в строке состояний
- •П 5. Диалоговые панели п. 5.1. Характеристики диалоговых панелей
- •5.1.1. Единицы диалоговой панели '
- •5.1.2. Стили диалоговой панели
- •5.1.3. Функция окна диалоговой панели
- •П. 5.2. Создание диалоговой панели
- •5.2.1 Создание окна модальной диалоговой панели
- •5.2.2 Создание окна немодальной диалоговой панели
- •П. 5.3 Разработка и компоновка диалоговых панелей.
- •П. 5.4 Сообщения и диалоговые панели
- •П. 5.5. Стандартные диалоговые панели
- •5.5.1. Панели для открытия или сохранения файлов
- •5.5.2. Панель для выбора цветов
- •5.5.3. Панель для выбора шрифта
1.5.3 Двойные щелчки мыши
Двойным щелчком мыши называются два, следующих одно за другим в быстром темпе, щелчка мыши.
-
Для того, чтобы два последовательных щелчка считались двойным щелчком, они должны произойти в течение очень короткого промежутка времени, который зовется временем двойного щелчка (double-click time).
Если необходимо, чтобы оконная процедура получала сообщения двойного щелчка мыши, то следует включить идентификатор CS_DBLCLKS при задании стиля класса окна перед вызовом функции RegisterClass, например:
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
-
Если CS_DBLCLKS не включить в стиль окна, и пользователь в быстром темпе щелкнет левой кнопкой мыши, то оконная процедура получит сообщения о двух одинарных щелчках мыши в следующей последовательности: WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP.
-
Если же CS_DBLCLKS включить в стиль окна, то при двойном щелчке оконная процедура получает следующие сообщения: WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,VM_LBUTTONUP. Сообщение WM_LBUTTONDBLCLK просто заменяет второе сообщение WM_LBUTTONDOWN.
1.5.4 Сообщения мыши, связанные с нерабочей областью окна
Если мышь оказывается вне рабочей области окна, но все еще внутри окна, то Windows посылает оконной процедуре сообщения мыши, связанные с нерабочей областью (нерабочая область включает в себя панель заголовка, меню, рамку окна и полосы прокрутки).
Обычно нет необходимости обрабатывать сообщения мыши нерабочей области. Вместо этого их передают в DefWibdowProc, чтобы Windows могла выполнить системные функции. В этом смысле сообщения мыши нерабочей области похожи на системные сообщения клавиатуры.
Сообщения мыши нерабочей области почти полностью такие же, как и сообщения мыши рабочей области. В названия сообщений входят буквы NC, что означает нерабочая (nonclient).
1.5.5 Захват мыши
Оконная процедура обычно получает сообщения мыши только тогда, когда курсор мыши находится в рабочей или в нерабочей области окна.
Но иногда программе может понадобиться получать сообщения от мыши и тогда, когда курсор мыши находится вне окна. Если это необходимо сделать, то приложение может произвести захват (capture) мыши.
Захватить мышь достаточно легко. Для этого достаточно вызвать функцию SetCapture. После вызова этой функции, Windows посылает все сообщения мыши в оконную процедуру того окна, чей дескриптор окна был передан в функцию SetCapture.
Пока мышь захвачена, системные функции клавиатуры не действуют.
Сообщения мыши в захваченном состоянии всегда остаются сообщениями рабочей области, даже если мышь оказывается не в рабочей области окна. Параметр lParam по-прежнему показывает положение мыши в координатах рабочей области. Эти координаты, однако, могут стать отрицательными, если мышь окажется левее или выше рабочей области.
Освободить мышь, т.е. возвратить обработку мыши в нормальный режим, можно при помощи функции ReleaseCapture.
П. 1.6 Сообщения от клавиатуры
1.6.1 Синхронизация событий клавиатуры
Приложение узнает о нажатиях клавиш посредством сообщений, которые посылаются оконной процедуре. Когда пользователь нажимает и отпускает клавиши,
-
Драйвер клавиатуры передает информацию о нажатии клавиш в Windows.
-
Windows сохраняет эту информацию (в виде сообщений) в системной очереди сообщений.
-
Затем она передает сообщения клавиатуры, по одному за раз, в очередь сообщений программы, содержащей окно, имеющее фокус ввода (input focus).
-
Затем программа отправляет сообщения соответствующей оконной процедуре (с помощью функции DispatchMessage).
Смысл этого двухступенчатого процесса – сохранение сообщений в системной очереди сообщений и дальнейшая их передача в очередь сообщений приложения – в синхронизации.
Если пользователь печатает на клавиатуре быстрее, чем программа может обрабатывать поступающую информацию, Windows сохраняет информацию о дополнительных нажатиях клавиш в системной очереди сообщений, поскольку одно из дополнительных нажатий может быть переключением фокуса ввода на другую программу. Информацию о последующих нажатиях следует затем направлять в другую программу. Таким образом, Windows корректно синхронизирует такие события клавиатуры.
Для отражения различных событий клавиатуры Windows посылает программам восемь различных сообщений. Программы вполне могут игнорировать многие из них; кроме того, в большинстве случаев, в этих сообщениях от клавиатуры содержится значительно больше закодированной информации, чем нужно приложению.