![](/user_photo/2706_HbeT2.jpg)
- •Подведение итогов
- •Глава 8. Вывод текстовой информации и использование шрифтов
- •Атрибуты шрифтов и диалоговое окно их выбора
- •Задание 1. Генерация программы отображения текста заданным шрифтом и создание ресурсов
- •Задание 2. Реализация обработчика для команды выбора атрибутов шрифта
- •Установка атрибутов текста и его отображение
- •Значения констант выравнивания текста
Установка атрибутов текста и его отображение
Отображение текста или графики происходит в объекте контекста устройства, который сохраняет информацию о шрифте и других атрибутах рисования. Он предоставляет функцию для отображения графических изображений на контекстно-связанном устройстве. Если программа отображает выводимую информацию с помощью функции класса представления, отличной от функции OnDraw(), создается собственный объект контекста устройства. В программе TextDemo используется класс CClientDC для создания объекта контекста устройства, связанного с клиентской областью окна.
Чтобы задать шрифт, используемый для отображения текста, функция OnDraw() класса представления вызывает функцию CDC::SelectObject(), которой передается указатель на объект класса CFont. Поскольку объект класса CFont создается в классе документа, то для доступа к нему необходимо определить указатель на объект документа. Для определения указателя на объект документа класс представления имеет встроенную функцию-член GetDocument(), прототип которой приводится ниже.
CDocument* CView::GetDocument() const;
В программе TextDemo указатель на объект класса документа определяется в функции CTextDemoView::OnDraw() с помощью следующего оператора.
CTextDemoDoc* pDoc = GetDocument();
Полученный указатель pDoc на объект документа позволяет осуществить доступ к объекту шрифта и сформировать его адрес, который в качестве аргумента передается в функцию CDC::SelectObject(). При выборе нового шрифта класс документа инициализирует объект его описанием. Как только объект шрифта будет передан объекту контекста устройства, весь выводимый текст будет отображен с использованием шрифта, описание которого соответствует сохраняемому в объекте шрифта. Если в системе отсутствует нужный шрифт, то используется наиболее близкий по описанию. Если шрифт не выбран, текст отображается с использованием стандартного системного шрифта System. Выбор шрифта в объекте контекста устройства в программе TextDemo выполняется таким оператором:
рDC->SelectObject (&pDoc->m_Font);
Здесь рDC — указатель на объект контекста устройства.
Т а б л и ц а 8.6
Значения, присваиваемые параметру nIndex функции CDC::SelectStockObject() для выбора стандартного шрифта
Значение параметра |
Стандартный шрифт |
SYSTEM_FONT |
Системный шрифт System с переменным питчем (шагом). Используется для отображения текста на экране, если шрифт не выбран в объекте контекста устройства. Используется Windows для отображения заголовков, меню и элементов управления диалоговых окон |
SYSTEM_FIXED_FONT |
Системный шрифт Fixedsys с фиксированным питчем. Шрифт, пригодный для программ редактирования и других приложений, в которых применяется шрифт с фиксированным питчем. Используется редактором Notepad |
ANSI_VAR_FONT |
Шрифт с переменным питчем, более мелкий, чем заданный значением SYSTEM_FONT |
ANSI_FIXED_FONT |
Шрифт с фиксированным питчем, более мелкий, чем заданный значением SYSTEM_FIXED_FONT |
DEVICE_DEFAULT_FONT |
Шрифт устройства, заданный по умолчанию (например, для окна — System, для принтера НР Laser Jet II — Courier) |
OEM_FIXED_FONT |
Шрифт Terminal с фиксированным питчем. Соответствует набору символов, используемых основными аппаратными средствами. |
Отображение диалогового окна Font и использование объекта шрифта позволяет выбрать любой из доступных шрифтов для экрана или для другого устройства, указанного перед отображением диалогового окна. Можно выбрать стандартный шрифт, не отображая диалоговое окно Font и не используя объект шрифта. Стандартным является шрифт, принадлежащий небольшому набору типовых шрифтов Windows, обычно используемых для отображения информации на экране. Чтобы выбрать стандартный шрифт, вызовите функцию CDC::SelectStockObject(). Ее прототип представлен ниже.
virtual CGdiObject* SelectStockObject (int nIndex);
Параметр nIndex — это индекс требуемого шрифта. Ему можно присвоить одно из значений, приведенных в табл. 8.6. Шрифты, соответствующие этим значениям, показаны на рис. 8.9.
Рис. 8.9 Стандартные шрифты Windows
Технология использования стандартных шрифтов показана в упражнении 4. Пример выбора системного шрифта с фиксированным питчем (шагом) для отображения текста показан ниже в следующем фрагменте:
void CTextdemoView::OnDraw(CDC* pDC) { CTextdemoDoc* pDoc = GetDocument(); // TODO: здесь добавьте код отображения pDoc->SelectStockObject (SYSTEM_FIXED_FONT); // установка атрибутов текста ... // отображение текста в окне представления ... }
При отображении строк текста необходимо обеспечить их появления в координатах, которые изменяются при выводе каждой новой строки. В противном случае, новая строка будет затирать предыдущую, если координаты ее появления в окне представления совпадают с координатами уже отображенной строки. Для равномерного размещения строк в окне представления необходимо учесть высоту самого высокого символа и междустрочное расстояние. Эти значения для каждого шрифта сохраняются в структуре TEXTMETRIC, описанной ранее. Для получения атрибутов шрифта, сохраненных в структуре TEXTMETRIC, вызывается функция CDC::GetTextMetrics(), прототип которой рассмотрен ранее.
Класс контекста устройств CDC инкапсулирует множество текстовых функций (Text Functions) и функций по работе с атрибутами рисования (Drawing-Attribute Functions), которые устанавливают атрибуты текста, возвращают установленные значения атрибутов и отображают текст. Здесь приводится обзор некоторых функций класса CDC.
Функция CDC::SetTextColor() устанавливает цвет текста, заданный при выборе шрифта. Если вы не выбрали цвет текста, он будет отображаться черным. В качестве параметра используется цвет текста как значение RGB цвета. Прототип функции такой:
virtual COLORREF CDC::SetTextColor( COLORREF crColor );
Вызов функции СDC::SetBkMode() устанавливает режим фоновой окраски текста, который относится к области, окружающей символы внутри символьных ячеек. При передаче значения аргумента TRANSPARENT в функцию СDC::SetBkMode() символы отображаются прямо поверх существующих в устройстве цветов без окраски фона. Если в функцию СDC::SetBkMode() передать значение OPAQUE, то при отображении символов фон текста будет нарисован поверх существующих цветов на отображающей поверхности устройства (это стандартный режим фона). В режиме OPAQUE по умолчанию используется белый цвет. Таким образом, эта функция либо разрешает, либо запрещает окраску фона текста. Функция объявляется следующим образом:
int CDC::SetBkMode( int nBkMode );
Вызывая функцию CDC::SetBkColor() можно установить различные цвета фона. Функция OnDraw() класса представления определяет режим TRANSPARENT так, чтобы символы отображались поверх цвета фона окна представления, поэтому в программе не нужно устанавливать цвет фона. Обратите внимание: фон окна окрашивается с использованием системы цветов “Window”, устанавливаемой апплетом Display панели управления (Control Panel) Windows. Прототип функции CDC::SetBkColor() определен таким образом:
virtual COLORREF CDC::SetBkColor( COLORREF crColor );
В качестве параметра используется RGB код цвета фона.
Текущий режим отображения, определяющий систему координат и единицы измерения для позиционирования текста и графики, устанавливается с помощью функции CDC::SetMapMode(), прототип которой определяется так:
virtual int CDC::SetMapMode( int nMapMode );
В таблице 8.5 приведены значения констант, которые передаются в функцию CDC::SetMapMode() в качестве аргумента. Напомним, что режим MM_TEXT разрешает работать в пикселах устройства (1 логическая единица соответствует 1 пикселу).
Для выравнивания текста используют функцию CDC::SetTextAlign(). Параметр функции определяет флажки, которые задаются для выравнивания текста по горизонтали или по вертикали. Определен прототип функции:
UINT CDC::SetTextAlign( UINT nFlags );
Функция возвращает значение типа UINT, младший байт которого содержит установку горизонтального выравнивания текста, а старший байт — установку вертикального выравнивания. Значения флажков, определяющих типы выравнивания, приведены в табл. 8.7.
Т а б л и ц а 8.7