- •Часть 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. Панель для выбора шрифта
П 3. Вывод в окно
Вывод в окна обладает рядом особенностей.
1. Нельзя пользоваться функциями вывода библиотеки компилятора, поскольку они приспособлены для вывода в одно и единственное окно. В операционной системе Windows приложения выводят одновременно в различные окна. Система сама решает все проблемы, связанные с возможным перекрытием или перемещением этих окон. С этим обстоятельством связано то, что в окно стремятся выводить в одном месте приложения - при обработке сообщения WM_PAINT. Приложение описывают таким образом, чтобы при поступлении сообщения WM_PAINT функция окна могла перерисовать в окно или любую его заданную часть.
2. Интерфейс графических устройств (Graphics Device Interface -GDI) системы открывает доступ к большому количеству функций вывода. Приложения, обращаясь к функциям GDI, работают не с физическими устройствами вывода, а с логическими. То есть описание вызова функций независит от физического способа отображения. GDI передает указания о выводе драйверу устройства вывода. Драйвер работает непосредственно с физическим устройством и при управлении выводом учитывает его ограниченные возможности и аппаратные особенности. Благодаря этому приложения способны работать с любым устройством вывода, драйвер которого установлен в системе. В этой главе рассматриваются функции и параметры вывода в окно на экране видеомонитора. Но не все физические устройства вывода способны поддерживать те режимы, в которых работает видеомонитор. Поэтому, описывая последовательность операций вывода, например на принтер, следует учитывать ограниченные возможности установленного принтера.
3. Параметры вывода устанавливают в контексте отображения с помощью функций GDI. Контекст отображения - это структура данных, которая содержит характеристики устройства вывода и указатели на выбранные инструменты рисования. Функции GDI используют только выбранные в контекст отображения параметры и инструменты рисования. Например, для рисования линии некоторой толщины в контекст отображения приложение должно выбрать перо этой толщины.
4; Дескриптор контекста отображения служит первым аргументом вызова всех функций, связанных с выводом в окно.
П. 3.1. Виды контекста отображения
Существуют следующие виды контекста отображения:
• общий;
• для класса окон;
• личный;
• родительский;
• для окна.
Способы получения и освобождения контекста отображения зависят от вида контекста. Каждый контекст имеет свои особенности и назначение.
Общий контекст отображения
Этот контекст отличает высшая скорость доступа к нему. Для получения общего контекста вызывают функцию BeginPaint (при обработке сообщения WM_PAINT) или GetDC (для рисования при обработке других сообщений). Стиль класса окна с общим контекстом отображения не может содержать значения CS_OWNDC, CS_PARENTDC или CS_ CLASSDC.
Функция GetDC возвращает контекст отображения для рабочей области окна hwnd:
HDCGetDC(HWNDhwnd);
Параметры возвращаемого контекста зависят от стиля класса указанного окна. Для общего контекста функция GetDC устанавливает заданные по умолчанию атрибуты. А параметры контекста отображения класса окон или личного контекста отображения функция GetDC оставляет неизменными. Если hwnd=NULL, то возвращается контекст видеомонитора с началом координат в левом верхнем углу экрана. В последнем случае допускается вывод в любом месте экрана.
В случае ошибок функция GetDC возвращает NULL.-
Эту функцию вызывают, если требуется вывод в окно во время обработки других сообщений, не посылая сообщения WM_PAINT.
Для освобождения общего контекста отображения, полученного функцией GetDC, вызывают функцию ReleaseDC. Контекст отображения для класса окон и личный контекст отображения освобождать не обязательно. Функция ReleaseDC освобождает только общий контекст отображения или контекст отображения для окна:
int ReleaseDC( HWND hwnd, HOC hdc);
Здесь hwnd - дескриптор, окна, чей контекст должен быть освобожден, а hdc - освобождаемый контекст отображения.
Если контекст освобожден, возвращаемое значение 1, иначе - нуль.
Приложения вызывают функцию ReleaseDC для каждого вызова функции GetWindowDC и для каждого вызова функции GetDC.
Внимаение! Еще раз обращаем ваше внимание на необходимость своевременного освобождения общего контекста отображения.
Контекст отображения для класса окон
Можно создать единственный контекст отображения для всех окон | некоторого класса. Для этого при регистрации класса указывают стиль ] CS_CLASSDC. Тогда все окна этого класса будут пользоваться одним | общим контекстом отображения.
Приложения, однажды получив контекст отображения для класса окон, могут не освобождать его. Причем вызов функций EndPaint и ReleaseDC не освобождает такой контекст (хотя и не вредит работе приложения). Для сохранения единого стиля работы с контекстами рекомендуется всегда вызывать эти функции.
Контекст отображения для класса окон создают один раз. Если создано несколько окон этого класса, область ограничения и начало системы физических координат вывода автоматически настраиваются на то окно, которое использует контекст отображения. Но если на базе класса стиля CS_CLASSDC приложение создало только одно окно, оно может получить контекст отображения дня класса окон один раз и не освобождать его.
Таким образом, контекст отображения для класса окон повышает производительность вывода в окна тем, что не требует настройку многочисленных атрибутов контекста отображения после каждого вызова функции BeginPaint или EndPaint.
Личный контекст отображения
Этим контекстом обладают окна класса со стилем CS_OWNDC. Личный контекст получают один раз и настраивают его атрибуты, а освобождают только ,при завершении работы приложения. Функции BeginPaint, EndPaint, GetDC и ReleaseDC не влияют на личный контекст. Личный контекст экономит расход оперативной памяти.
Родительский контекст отображения
Этот контекст используют дочерние окна. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно.
С этой целью в стиле класса дочерних окон указывают значение CSJ»ARENTDC.
Контекст отображения для окна
Описанные выше контексты позволяют рисовать только в рабочей области окна. Контекст отображения дня окна позволяет рисовать в любом месте окна- в области заголовка, системного меню, рамок, кнопок изменения размера окна и т. п.
Контекст отображения для окна получают с помощью функции GetWindowDC. Далее он используется аналогично общему контексту отображения. При этом начало системы координат находится в левом верхнем углу окна, а не рабочей области. Прототип функции подобен прототипу функции GetDC:
HOC GetWindowOC( HWND hwnd);
Для освобождения контекста отображения для окна вызывают функцию ReleaseDC.
Для вывода в различные части окна нужно предварительно определить метрики окна с помощью функции GetSystemMetrics.