- •Лабораторный практикум «Основы разработки приложений 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
Вывод на экран текстовых строк
Как и в случае любых других графических инструментов, вывод текста в окно приложения осуществляется тем шрифтом, дескриптор которого выбран в настоящий момент в контекст устройства. Поэтому общая процедура использования шрифта выглядит следующим образом:
в функции OnCreate()обработки сообщенияWM_CREATEсоздаются необходимые шрифты, а их дескрипторы запоминаются в глобальных переменных;
в функции OnPaint()обработки сообщенийWM_PAINTс помощью макросаSelectFont()в контекст устройства выбирается дескриптор требуемого шрифта;
при необходимости в контексте устройства устанавливаются требуемые характеристики шрифта – цвет и прозрачность фона;
с помощью функций TextOut()илиDrawText()в окно приложения выводятся требуемые строки.
Функция TextOut()позволяет вывести в окно приложения строку текста, начиная с точно заданной точки, координаты которой в виде номеров пикселов указываются в параметрах функции. Координаты относятся к верхнему левому углу знакоместа. Поскольку шрифты в Windows могут иметь различный размер, высота знакоместа обычно заранее неизвестна, и для того чтобы последовательные строки не накладывались друг на друга, необходимо с помощью структуры типаTEXTMETRICи функцииGetTextMetrics()определить высоту символов и, исходя из этой величины, задавать координаты следующих строк. Эта процедура была описана в пособии [1].
Функция DrawText()позиционирует текст по-другому. Из ее прототипа, взятого из интерактивного справочника
int DrawText(HDC hDC, LPCTSTR lpString, int nCount,
LPRECT lpRect, UINT uFormat);
видно, что в качестве ее параметров выступают: дескриптор контекста устройства hDC, адрес выводимой строкиlpString, длина выводимой строкиnCount, адресlpRectструктурной переменной типаRECTс координатами прямоугольной области экрана, в которую выводится текст, а также константа форматирования текстаuFormat.
Функция DrawText()выводит заданный текст в указанную прямоугольную область (которая может быть и гораздо больше выводимой строки по размеру), причем расположение текста внутри области определяется последним параметром функции. Использованная в приводимом ниже примере символическая константаDT_CENTERпозиционирует текст по горизонтали по центру прямоугольника (рис. 2.1).
Рис. 2.1. Расположение текстовой строки в главном окне приложения при использовании функции DrawText()
Текст может быть позиционирован также по левому краю заданной прямоугольной области (константа DT_LEFT) или по правому краю (константаDT_RIGHT).
Если текст состоит из одной строки, а высота области превышает высоту текста, то строку можно позиционировать и по вертикали, для чего используются константы DT_VCENTER,DT_BOTTOMилиDT_TOP. Позиционирование по вертикали требует явного объявления текста однострочным с помощью константыDT_SINGLELINE. Все константы позиционирования можно комбинировать с помощью побитовой операции ИЛИ (символ|языка С++).
Вывод текстовых строк с помощью функции DrawText()очень удобен в плане задания аккуратного расположения строк, хотя и оказывается более сложным, чем при использовании функцииTextOut(). Ниже приведен текст функцииOnPaint(), использованной при приложении, вывод которого приведен на рис. 2.1:
void OnPaint(HWND hwnd){
PAINTSTRUCTps;
RECTr;//Прямоугольная область для вывода строки текста
char s[]="Строка текста";//Сама строка
HDChdc=BeginPaint(hwnd,&ps);//Получим контекст устройства
r.left=5;//Задаем координаты прямоугольника
r.top=30;//в пределах главного окна
r.right=ps.rcPaint.right-5;//Ради симметрии по горизонтали
r.bottom=80;//Высота прямоугольника почти произвольна
SelectFont(hdc,hFont);//Выбираем крупный шрифт
//(созданный заранее)
SetBkMode(hdc,TRANSPARENT);//Назначаем прозрачность фона
DrawText(hdc,s,strlen(s),&r,//Собственно вывод строки
DT_CENTER|DT_VCENTER|DT_SINGLELINE);//Центрируем
EndPaint(hwnd,&ps);
}
Ширина окна здесь получена из структурной переменной ps, где она входит в состав элементаrcPaintтипаRECT.