Использование шрифтов в диалоговом окне




Всякий раз, когда программа выводит что-нибудь на экран, она обращается к GDI-функциям. GDI(Graphic Device Interface — Интерфейс графического устройства) представляет собой библиотеку классов, методы которых реализуют операции рисования, вывода изображений и текста, создания шрифтов и определения контекстов устройств. Вывод текста или графики на экран возможен только в объекте контекста устройства, который является структурой GDI, и используется для сохранения, восстановления, изменения атрибутов графических объектов и определения графических режимов. Мы будем рассматривать графический объект — шрифт, который сохраняется в объекте контекста устройства и используется для отображения текста.

Класс CDCявляется базовым классом контекстов устройств. От него порождаются классы CPaintDCи другие. Класс CPaintDC — специальный класс, управляющий контекстами устройств, которые используются только для реакции на сообщение WM_PAINT. О других классах контекстов устройств речь пойдет дальше. Для создания объекта контекста устройства необходимо использовать конструктор соответствующего класса, которому передается в качестве аргумента указатель на окно, для которого создается контекст устройства. Указатель this определяет текущее окно. Мастер добавления функций при добавлении функции CFormatDlg::OnPaint() для обработки сообщения WM_PAINT генерирует вызов конструктора класса CPaintDC следующим образом.

 

CPaintDC dc(this); // device context for painting

 

GDI поддерживает такие типы объектов, как: перо, кисть, шрифт, палитра, растровый рисунок и регион. Каждый тип объектов GDI представлен отдельным классом MFC. На этом занятии мы будем использовать объект шрифта, который является экземпляром класса CFont. Более подробно объекты GDI рассматриваются дальше.

Для создания объекта шрифта используется конструктор, прототип которого такой.

 

CFont();

 

Созданный объект шрифта необходимо инициализировать перед его использованием с помощью функций CFont::CreateFont(), CFont::CreateFontIndirect(), CFont::CreatePointFont() или CFont::CreatePointFontIndirect().

В процессе инициализации объектов определяются их атрибуты, для сохранения которых используются структуры, чей тип зависит от типа GDI-объектов. Так, объект класса CFont определяет структуру типа LOGFONT. Рассмотрим подробнее структуру LOGFONT. Для задания значений атрибутов шрифта структура LOGFONT имеет такие поля:

typedef struct tagLOGFONT {
LONG lfHeight; //высота шрифта
LONG lfWidth; //средняя ширина символа
LONG lfEscapement; //угол нанесения текста
LONG lfOrientation; //наклон символов
LONG lfWeight; //толщина шрифта
BYTE lfItalic; //атрибут курсив
BYTE lfUnderline; //атрибут подчеркивания
BYTE lfStrikeOut; //атрибут перечеркивания
BYTE lfCharSet; //идентификатор набора символов
BYTE lfOutPrecision; //выходная точность шрифта
BYTE lfClipPrecision; //способ обрезания шрифта
BYTE lfQuality; //качество изображения шрифта
BYTE lfPitchAndFamily; //наличие фиксированной или
//переменной ширины литер
TCHAR lfFaceName[LF_FACESIZE]; //имя шрифта
} LOGFONT;

Для полей lfWeigh, lfCharSet, lfOutPrecision, lfClipPrecision, lfQuality и lfPitchAndFamily определены наборы констант. Например, для поля lfWeigh (толщина шрифта) заданы константы с префиксом FW: FW_NORMAL, FW_BOLD и др. Полный перечень констант, определяющих толщину шрифта, приведен в табл. В2 приложения В.

Объявив переменную типа LOGFONT и присвоив полям структуры нужные значения, можно инициализировать объект класса CFont, вызвав функцию CFont::CreateFontIndirect(), параметром которой является указатель на структуру LOGFONT. Прототип функции следующий:

BOOL CFont::CreateFontIndirect(const LOGFONT* lpLogFont);

В случае использования функции CFont::CreateFont() параметрами являются переменные, соответствующие полям структуры LOGFONT. Ниже приводится прототип этой функции.

BOOL CFont::CreateFont(int nHeight,int nWidth, int nEscapement,
int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,
LPCTSTR lpszFacename);

После инициализации объекта класса CFont методом CFont::CreateFontIndirect() или CFont::CreateFont() объект будет ассоциирован с имеющимся набором шрифтов Windows. Теперь его можно выбрать в объект контекста устройства. Выбор объекта GDI в объекте контекста устройства лежит в основе концепции программирования вывода информации в Windows. Программист не может непосредственно использовать объект GDI. Он должен выбрать его в объекте контекста устройства и затем иметь дело только с контекстом устройства. Выбор объектов в контекст устройства можно выполнить, вызвав функцию CDC::SelectObject(). В зависимости от класса объектов используются разные прототипы функции выбора объектов. Мы будем рассматривать функцию выбора объекта шрифта:

virtual CFont* CDC::SelectObject(CFont* pFont);

Параметром функции CDC::SelectObject()является указатель на объект класса CFont. Функция CDC::SelectObject() возвращает указатель на ранее выбранный в объекте контекста устройства объект шрифта, который теперь отсоединяется от контекста. Поскольку нельзя отсоединить старый объект, не выбрав в контекст новый, то необходимо сохранить указатель на объект, который был ранее включен в контекст, вызвав функцию CDC::SelectObject() и передав ей в качестве аргумента указатель на новый объект. Сохраненный указатель на GDI-объект будет использоваться для восстановления объекта контекста устройства после завершения работы с новым объектом. Для этого повторно вызывают функцию CDC::SelectObject(), передавая ей указатель на первоначальный объект. Таким образом, если вы создали GDI-объект, то обязаны удалить его до завершения программы.

Windows предоставляет пользователю ряд стандартных GDI-объектов (stock GDI objects). Так как эти объекты — часть Windows, то система сама управляет их удалением. Для выбора стандартных объектов в объекте контекста устройства используются функции CDC::SelectStockObject()и CGdiObject::CreateStockObject(). Прототипы функций даны ниже.

virtual CGdiObject* CDC::SelectStockObject(int nIndex);
BOOL CGdiObject::CreateStockObject(int nIndex);

Параметр nIndex определяет тип стандартного GDI-объекта. Мы будем использовать стандартные шрифты. Некоторые константы их определяющие приведены в табл. 6.5.

Т а б л и ц а 6.5

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: