- •Часть 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.3. Установка атрибутов контекста отображения для текста
Контекст отображения, кроме характеристик устройства вывода, содержит указатели на выбранные в контекст инструменты. Инструменты настраивают с помощью атрибутов контекста отображения (их около 20).
По умолчанию для фона операции вывода в контекст отображения выбран белый цвет. Функция SetBkColor устанавливает новый цвет для фона вывода:
COLORREF SetBkCotor( HDC hdc, COLORREF crColor);
В случае успешной установки она возвращает значение предыдущего цвета фона. Параметр crColor задает новый цвет фона. Если установлен непрозрачный режим фона вывода, цвет фона crColor используют для заполнения промежутков между линиями изображения или символами текста. Этот цвет используют и при преобразовании разноцветных изображений в моноцветные.
Тип COLORREF равноценен типу DWORD. Для получения значения цвета типа COLORREF существует функция
COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue);
Она возвращает значение цвета в формате COLORREF в виде интенсивности красной (bRed), зеленой (ЬGгееn) и голубой (bBlue) составляющих цвета. Интенсивность каждого аргумента может принимать значения в диапазоне от 0 до 255. Если все три значения раины нулю, результат - черный. Если все три - 255, результат - белый. В качестве примера в табл. перечислены красная, зеленая и голубая составляющие системных цветов.
В случае неудачи возвращаемое значение функции RGB равно CLR_INVALID.
Существует два режима фона- непрозрачный (OPAQUE - значение по умолчанию) и прозрачный (TRANSPARENT). В режиме непрозрачного вывода цвет фона текущей позиции заменяется цветом фона вывода. В режиме TRANSPARENT цвет фона не заменяется.
Режим фона устанавливает функция SetBkMode:
int SetBkMode( HOC hoc, int IBkMode);
Параметр iBkMode принимает значение TRANSPARENT или OPAQUE. В случае успешного выполнения функция возвращает значение предыдущего режима, иначе - нуль.
По умолчанию цвет вывода текста выбран черным. Другой цвет вывода символов текста устанавливает функция SetTextColor:
COLORREF SetTextColor(HDC hdc, COLORREF crColor);
Параметр crColor задает новый цвет. В случае успешной установки нового цвета возвращается значение предыдущего цвета, иначе -CLRJNVALID. Этот цвет также используют при преобразовании разноцветных изображений в моноцветные и наоборот.
По умолчанию расстояние между буквами равно 0. Расстояние между буквами устанавливает функция SetTextCharacterExtra:
int SetTextCharacterExtra( HBC hdc, int nCharExtra);
Параметр nCharExtra определяет расстояние между символами в логических единицах. Во всех режимах (кроме MMJTEXT) значение nCharExtra кратно пикселю. В случае успешного выполнения функция возвращает предыдущий интервал между символами, иначе - 231.
П 3.4. Вывод текста
3.4.1. Настройка параметров шрифта
В контекст отображения по умолчанию выбирают системный шрифт. Для создания логического шрифта удобно вызвать функцию CreateFont Indirect:
HFONT WINAPI CreateFontlndirect(const LOGFONT FAR* Iplf);
Она'возвращает дескриптор созданного шрифта. В качестве аргумента вызова функции CreateFonthidirect передают указатель на структуру типа LOGFONT:
typedef struct { LONG IfHeight;
LONG IfWidth;
LONG IfEscapement;
LONG IfOrientation;
LONG IfWeight;
BYTE Ifltalic;
BYTE IfUndertine;
BYTE IfStrikeOut;
BYTE IfCharSet;
BYTE IfOutPrecision;
BYTE IfClipPrecision;
BYTE IfQuality;
BYTE IfPitchAndFamily;
TCHAR IfFaceNamelLF.FACESIZE];
} LOGFONT;
Назначение полей этой структуры:
1. IfHeight - высота шрифта в логических единицах. Положительное значение поля IfHeight задает высоту ячейки вывода букв. Если IfHeightO, то абсолютная величина значения IfHeight задает высоту символов. При lfHeight=0 создают шрифт с высотой символов по умолчанию: lffleight=12.
2. IfWidth - ширина символов в логических единицах. Если указано нулевое значение, используют ширину по умолчанию.
3. IfEscapement - угол (в направлении против часовой стрелки) в десятых долях градуса между линией вывода строки и координатной осью X. Значение IfEscapement может отличаться от нуля только для масштабируемых и векторных шрифтов.
4. IfOrientation - угол (в направлении против часовой стрелки) в десятых долях градуса между линией основания символа и координатной осью X. Рекомендуется задавать равным значению IfEscapement.
5. IfWeight - вес шрифта. Определяет жирность символов шрифта и может находиться в пределах от 0 до 1000. Принимает значения констант из следующей таблицы:
Константа
|
Вес
|
Константа
|
Вес
|
Константа
|
Вес
|
FW DONTCARE
|
0
|
FW NORMAL
|
400
|
FW BOLD
|
700
|
FW ТНШ
|
100
|
FW REGULAR
|
400
|
FW EXTRABOLD
|
800
|
FW EXTRALIGHT
|
200
|
FW MEDIUM
|
500
|
FW ULTRABOLD
|
800
|
FW ULTRALIGHT
|
200
|
FW SEMIBOLD
|
600
|
FW BLACK
|
900
|
FW LIGHT
|
300
|
FW DEMIBOLD
|
600
|
FW HEAVY
|
900
|
Многие шрифты содержат символы только весов FW_NORMAL, FW_REGULAR (нормальный) и FW_BOLD (полужирный). Если задать нулевое значение (lfWeight=0), используют вес по умолчанию.
6. Если Ifltalic не равен 0, запрашивают шрифт с наклонными буквами.
7. Если IfUnderline не равен 0, запрашивают шрифт с подчеркиванием букв.
8. Если IfStrikeOut не равен 0, запрашивают шрифт с перечеркнутыми буквами.
9. IfCharSet - наиболее важное поле структуры. Оно задает набор требуемых символов. Может принимать значения констант из следующей таблицы:
Константа
|
Описание
|
ANSI_CHARSET
|
Набор символов в кодировке ANSI
|
DEFAULT_CHARSET
|
Задают для запроса логического шрифта
|
SYMBOL_CHARSET
|
Символьный шрифт (например, Wingdings)
|
SHIFTJIS_CHARSET
|
Нужен для работы с японской версией Windows
|
OEM_CHARSET
|
Набор символов в кодировке OEM
|
Если lfCharSet=0, будет выбран шрифт ANSI CHARSET. 10. IfOutPrecision задает необходимую степень соответствия между параметрами запрашиваемого и предоставляемого шрифта. Можно указывать одну из следующих констант:
Константы
|
Описание
|
OUT DEFAULT PRECIS
|
Степень соответствия по умолчанию
|
OUT STRING PRECIS или OUT CHARACTER PRECIS
|
Выбрать шрифт с наибольшим соответствием в размерах символов
|
OUT STROKE PRECIS
|
Искать шрифт с полным соответствием
|
OUT_TT_PRECIS
|
Предпочтение шрифтам True Type
|
OUT DEVICE PRECIS
|
Выбрать шрифт устройства вывода
|
OUT RASTER PRECIS
|
Выбрать растровый шрифт
|
OUT TT ONLY PRECIS
|
Выбирать только шрифты True Type
|
11. IfClipPrecision задает способ обрезания изображения символа на границе вывода. Можно использовать следующие константы: CLIP_STROKE_ PRECIS, CLIP_MASK, CLIP_DEFAULT_PRECIS, CLIP_LH_ANGLES, CLIP_TT_ALWAYS, CLIP_EMBEDDED и CLIP_CHARACTER_ PRECIS. Если указана CLIP_LH_ANGLES, направление вращения текста зависит от установленного режима отображения.
12,IfQuality задает качество отображения символов. Можно указывать одну из следующих констант:
Константа
|
Описание
|
DEFAULT_QUALITY
|
Качество не имеет значения
|
DRAFT_QUALITY
|
Низкое качество
|
PROOF_QUALITY
|
Высокое качество
|
13. IfPitchAndFamily задает ширину символов и определяет семейство шрифта. Фиксированная или переменная ширина символов задается при помощи следующих констант:
Константа
|
Описание
|
DEFAULT_PITCH
|
He имеет значения, будет ли шрифт иметь фиксированную или переменную ширину символов
|
FIXED_PITCH
|
Нужен шрифт фиксированной ширины символов
|
VARIABLE PITCH
|
Нужен шрифт с переменной шириной символов
|
Следующие константы задают семейство шрифта:
|
|
Константа
|
Описание
|
FF_DECORATIVE
|
Шрифт, содержащий маленькие рисунки (например, Wingdings)
|
FF_DONTCARE
|
Семейство шрифта не имеет значения
|
FF_MODERN
|
Семейство Modern. Фиксированная ширина символов, Morvr быть засечки (но могут и не быть)
|
FF_ROMAN
|
Семейство Roman. Переменная ширина букв, есть засечки
|
FF_SCRIPT
|
Семейство Script. Рукописный шрифт
|
FF_SWISS
|
Семейство Swiss. Переменная ширина букв, нет засечек
|
14. IfFaceName - строка с именем шрифта. Длина этой строки не должна превышать 32 символа. Если IfFaceName - пустая строка, используют шрифт, который соответствует по другим атрибутам. Получив запрос, GDI начинает искать шрифт, сравнивая последовательно поля IfCharSet, IfPitchAndFamily и IfFaceName. После сравнения этих полей GDI сравнивает высоту букв шрифта, затем поля IfWidth, Ifltalic, IfUnderline и IfStrikeOut.