- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум73
- •Часть 1 Теоретические сведения
- •1. Основы архитектурЫ защищенного режима Регистры процессора
- •Адресация памяти
- •2. Логические шрифты Создание логических шрифтов
- •Вывод на экран текстовых строк
- •3. Таймеры Windows Организация и обслуживание таймеров
- •Мультимедийные таймеры
- •Измерение интервалов времени
- •Организация периодического процесса
- •Задание однократного интервала времени
- •4. Дочерние окна Создание и использование дочерних окон
- •Окна предопределенных классов в главном окне
- •5. Вывод растровых изображений
- •Процедура вывода растрового изображения
- •Компоновка составных изображений
- •6. Обслуживание файлов в 32-разрядных приложениях Windows
- •Базовые операции с файлами Открытие и создание файла
- •Запись и чтение файла
- •Файлы, проецируемые в память
- •7. Процессы и потоки
- •Создание дочернего процесса
- •Создание дочернего потока
- •Синхронизация потоков Общие характеристики объектов Windows
- •Синхронизация с помощью состояний потока
- •Синхронизация с помощью событий
- •Критические секции и защита данных
- •8. Библиотеки динамической компоновки
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Создание логических шрифтов
- •Работа 2. Таймеры Windows(индивидуальное задание а)
- •Работа 3. Дочернее окно в главном окне приложения
- •Работа 4. Вывод растровых изображений с использованием совместимой памяти
- •Работа 5. Измерение временных характеристик программы с помощью мультимедийного таймера
- •Работа 6. Вывод движущихся изображений с синхронизацией от системного таймера (индивидуальное задание b)
- •Работа 7. Повышение качества движущихся изображений с помощью совместимой памяти
- •Работа 8. Движение изображения по фоновому рисунку
- •Работа 9. Работа с файлами (индивидуальное задание c)
- •Работа 10. Стандартные диалоги Windows для работы с файлами
- •Работа 11. Проецирование файла в память
- •Работа 12. Потоки (индивидуальное задание d)
- •Работа 13. Синхронизация потоков с помощью событий
- •Работа 14. Защита данных с помощью критической секции
- •Работа 15. Библиотеки динамической компоновки
- •Работа 16. Передача параметров в функции dll-библиотек
- •Индивидуальные задания лабораторного практикума
- •Задание c2.Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
2. Логические шрифты Создание логических шрифтов
Разрабатывая изобразительные детали приложения, естественно воспользоваться богатыми возможностями, предоставляемыми системой Windows в части шрифтового оформления документов. Для того чтобы создать красивый и наглядный документ или экранный кадр, приходится использовать шрифты с различным начертанием, оформлением (курсив, жирный, подчеркнутый), размером и пространственной ориентацией. В зависимости от принципа хранения в памяти компьютера формы символов различают растровые (точечные) и масштабируемые шрифты, которые еще называют шрифтами TrueType. Достоинство шрифтов TrueType заключается в том, что они позволяют изменять в широких пределах размер и другие характеристики символов (например, ширину букв) без снижения качества изображения, что и обусловило их широкое применение.
Операционная система Windows поставляется с базовым набором растровых и масштабируемых шрифтов с разнообразными начертаниями и характеристиками. Среди них имеются как шрифты с равной шириной всех символов (они традиционно используются, например, в исходных текстах программ), так и более приятные для глаза пропорциональные шрифты, у которых ширина символа зависит от его формы (буква “Ш”, например, шире символа “1”). Многие прикладные программы при их установке расширяют базовый набор Windows, добавляя свои шрифты; наконец, можно приобрести и установить в системе наборы шрифтов независимых разработчиков.
Работая с какой-либо коммерческой прикладной программой, использующей шрифты, например с текстовым редактором MicrosoftWordили графическим редакторомCorelDraw, пользователь может выбирать для оформления документа любые шрифты из установленных в системе, назначая им требуемые характеристики (размер, интервал между символами и строками т. д.) с помощью средств используемого редактора. Сложнее обстоит дело при разработке собственного приложения Windows. На экран можно вывести только тот шрифт, дескриптор которого загружен в контекст устройства; при необходимости изменить характеристики шрифта надо сначаласоздатьновый шрифт, хотя под этим обманчивым термином понимается не разработка собственного шрифта, а выбор одного из шрифтов, установленных в системе, и придание ему требуемых характеристик.
Правда, в системе имеется несколько готовых шрифтов, дескрипторы которых можно получить со “склада” Windows с помощью макроса SelectFont()или обобщенной функцииSelectObject(). Дескриптор одного из них по умолчанию загружается в контекст устройства при его создании. Однако возможности таких шрифтов ограничены, так как они не допускают изменения своих характеристик (кроме цвета).
Процедура создания нового шрифта довольно проста. Для этого нужно объявить в программе структурную переменную типа LOGFONT, заполнить ее поля требуемыми значениями и вызвать функцию WindowsCreateFontIndirect(). Эта функция вернет дескриптор нового шрифта; после выбора полученного дескриптора в контекст устройства любая функция вывода на экран текста будет использовать именно этот шрифт. Если в приложении желательно использовать разные шрифты, их можно создать заранее и выбирать в контекст устройства по мере необходимости. ФункцияCreateFontIndirect()использует в качестве исходного материалафизический шрифт, хранящийся на диске в виде файла; результатом работы этой функции будетлогический шрифт, дескриптор которого и загружается в контекст устройства. Вывести на экран текст непосредственно физическим шрифтом нельзя, так как функции GDI работают только с логическими шрифтами. Даже если мы хотим иметь шрифт с характеристиками, в точности соответствующими физическому шрифту, все равно из него сначала надо образовать логический шрифт (обнулив все члены структурыLOGFONT, кроме имени шрифта) и лишь затем им пользоваться.
Структура LOGFONTсодержит много членов, однако обычно можно ограничиться заданием лишь небольшой их части. Следует только иметь в виду, что неправильная установка того или иного члена этой структуры может привести к весьма неприятным последствиям, так как Windows, не сумев создать в точности заказанный вами шрифт, будет пытаться подобрать наиболее подходящий; часто в этом случае подбирается шрифт, весьма далекий от заказанного.
Структуру LOGFONTцелесообразно использовать для задания характеристик масштабируемых (TrueType) шрифтов; только в этом случае будут действовать такие, например, характеристики шрифта, как угол наклона или размер (растровые шрифты допускают изменение размера, но лишь в обусловленных пределах или при низком качестве увеличения).
Структура LOGFONTимеет следующий состав членов:
typedef struct tagLOGFONT
int lfHeight;//Высота
int lfWidth;//Средняя ширина; если=0, то по умолчанию
int lfEscapement;//Угол наклона в единицах 1/10 градуса
int lfOrientation;//Не используется
intlfWeight;//Насыщенность: FW_NORMAL (нормальная),
FW_BOLD (полужирный шрифт)
BYTE lfItalic;//Если=1, то курсив
BYTE lfUnderline;//Если=1, то подчеркивание
BYTE lfStrikeOut;//Если=1, то перечеркивание
BYTE lfCharSet;//Набор символов; обычно=0
BYTE lfOutPrecision;//Точность соответствия; обычно=0
BYTE lfClipPrecision;//Способ вырезки части символа;
//обычно=0
BYTE lfQuality;//Качество; обычно=0
BYTE lfPitchAndFamily;//Шаг и семейство; обычно=0
BYTE lfFaceName[LF_FACESIZE];//Имя начертания шрифта
} LOGFONT;
Наиболее важным является последний член описанной выше структуры, символьный массив lfFaceName. В него надо скопировать полное имя шрифта из числа шрифтов, установленных в Windows, напримерTimes New Roman Cyr,Arial Cyr,Courier New Cyrи т. д. Если в имени шрифта будет допущена хотя бы незначительная ошибка, Windows, скорее всего, создаст шрифт с совершенно другим начертанием. Обратите также внимание на то, что членlfFaceNameописан в структуреLOGFONT, как символьный массив длинойLF_FACESIZEсимволов. В эту переменную следует занести не адрес имени шрифта, а саму символьную строку с именем шрифта. Поэтому этот член нельзя инициализировать оператором присваивания; придется воспользоваться функцией C++strcpy()для копирования строк.
После того, как новые шрифты использованы для вывода на экран текстовых строк и необходимость в них отпала, их следует удалить, чтобы освободить занимаемую ими память. Это можно сделать и перед завершением приложения в функции OnDestroy()обработки сообщенияWM_DESTROYс помощью макросаDeleteFont() или обобщенной функцииDeleteObject(). Практически при завершении приложения Windows удаляет все созданные в нем объекты.