Логические шрифты

Процедуры создания и использования логических шрифтов в OWL-программах в принципе не отличаются от соответствующих процедур Windows API, описанных в гл. 15 и 16, а практически оказываются заметно проще. На рис. 26.5 приведен вывод программы 26-3, в которой демонстри­руются основные правила работы с логическими шрифтами. //Пример 26-3. Логические шрифты 11 Файл 26-3.срр #include <owl\framewin.h> /* Константы, описывающие размера изображения*/

const dx=22;//Шаг no X

const X=dx*9; //Ширина графика из 10 точек

const Y=120; //Высота графика /*Надписи на графиках*/

char title1[]="Процесс 1";

char title2[]="Процесс 2";

char title3[]="Процесс 3";

char legend[]="Ход процессов во времени";

/*Объекты классов положения и размеров*/

TPoint X0Y0(30,10}; //Верхний левый угол рамки

TPoint XmYm=X0Y0.OffsetBy(XBorder,YBorder); //Правый нижний угол рамки

TRect border(X0Y0,XmYm); //Прямоугольник рамки

/*Класс приложения, производный от TApplication (ради InitMainWindov)*/ class MyApp:public TApplication{ public:

void InitMainWindow(); //Замещаем функцию InitMainWindow };

/*Класс главного окна, производный от TFrameWindow (ради Paint)*/ class MyWindow:public TFrameWindow{ public:

MyWindow(TWindow*parent,char far*title):TFrameWindow(parent,title){ Attr.X=0;Attr.Y=0; Attr.W=245;Attr.H=200; }

void Paint(TDC&,bool,TRect&);//Переопределяем функцию Paint

};

/*3амещенная функция InitMainWindow()*/ void MyApp::InitMainWindow(void){

SetMainWindow(new MyWindow(0,"Программа 26-3"));

}

/*Замещенная функция Paint() */ void MyWindow::Paint(TDC&dc,bool, TRect&) {

int i; //Переменная циклов

char ticks [10] [2]; //Массив цифр под осью X


236 Глава 26

TFont font("Times New Roman",14};// Создаем шрифт для цифр под осью X dc.SelectObject(font); //Выбираем в контекст созданный шрифт TPoint р;// Текущая координата для рисования рисок dc.Rectangle(border) ;//Рисуем рамку for(i=0;i<=9;i++),{

p=border.BottomLeft()+=i*dx; //Текущая координата верхних концов рисок

dc.MoveTo(p); //Перемещаемся по верхним концам рисок

dc.LineTo(p.OffsetBy(0,5));// Рисуем риски вниз до рамки

wsprintf(ticks[i],"%d",i); IIПреобразуем цифры в символы

dc.TextOut(p.OffsetBy(-3,+3),ticks[i]); //Выводим цифры под осью

}

dc.TextOut(border.TopLeft().OffsetBy(-margins-25,-7),"100");// Выводим dc.TextOut(border.BottomLeft().OffsetBy(-margins-10,-7),"0"); //масштаб /*Выводим на экран линейные графики трех процессов*/

TColor color1(COLOR_ACTIVECAPTION+1); //Системный цвет заголовка активного окна TColor color2(COLOR_INACTIVECAPTION+1);//Цвет заголовка неактивного окна TColor color3(COLOR_WINDOW+1); //Цвет окна приложения TPen pen1(color1,2); //Создаем первое перо

dc.SelectObject(pen1); //и выбираем его в контекст устройства dc.MoveTo(border.BottomLeft()); //Перемещаемся в левый нижний угол рамки dc.LineTo(100,20); //Выводим график 1-го процесса (просто наклонная линия) TPen pen2(color2,2); //Создаем второе перо

dc.SelectObject(pen2); //и выбираем его в контекст устройства dc.MoveTo(border.BottomLeft()); //Перемещаемся в левый нижний угол рамки dc.LineTo(220,40); Выводим график 2-го процесса (просто наклонная линия) TPen реnЗ(colors,2); //Создаем третье перо

dc.SelectObject(реnЗ); //и выбираем его в контекст устройства dc.MoveTo(border.BottomLeft()); //Перемещаемся в левый нижний угол рамки dc.LineTo(220,100);// Выводим график 3-го процесса (просто наклонная линия) /*Создаем логические шрифты и выводим надписи на графиках*/

TFont font1("Arial",15,0,580); //Создаем шрифт для 1-го процесса dc.SelectObject(font1); //Выбираем его в контекст устройства TColor prevColor=dc.SetTextColor(color1); //Устанавливаем цвет шрифта dc.TextOut(40,80,title1); //Выводим текст у линии графика TFont font2("Arial",15,0,250); //Создаем шрифт для 2-го процесса dc.SelectObject(font2); //Выбираем его в контекст устройства dc.SetTextColor(color2); //Устанавливаем цвет шрифта dc.TextOut(135,60,title2); //Выводим текст у линии графика TFont font3("Arial",15,0,80); //Создаем шрифт для 3-го процесса dc.SelectObject(font3); //Выбираем его в контекст устройства dc.SetTextColor(color3); //Устанавливаем цвет шрифта dc.TextOut(130,95,title3); //Выводим текст у линии графика

TFont font4("Times New Roman",20,0,0,0,FW_BOLD,0,true); //Шрифт для подписи dc.SelectObject(font4); //Выбираем его в контекст устройства dc.SetTextColor(prevColor); //Восстанавливаем исходный цвет шрифта dc.TextOut(border.BottomLeft().OffsetBy(5,15),legend);// Выводим подпись }

/*Главная функция приложения OvlMain*/ int OwlMain(int,char*[]){

return MyApp().Run(); }

Программа 26-3 использует многие элементы предыдущего примера. Точно так же в главное окно приложения выводится рамка с рисками и цифрами масштаба, но в отличие от предыдущего примера, отображаемые данные занимают все поле рамки border, а поле graph (и константа margins) отсутствуют. Соответственно несколько увеличено расстояние dx между рисками на горизонтальной оси, а также вы­сота рамки Y. Удалены также горизонтальные риски. Отображаемые данные представляют собой три ли­нейных графика, будто бы показывающих ход каких-то процессов во времени. Для большей наглядности графикам приданы разные цвета (для задания которых использованы символические обозначения сис­темных цветов), и над каждым графиком тем же цветом выведена поясняющая надпись. Еще одна общая надпись сделана в нижней части окна.

Новой здесь является только операция создания логических шрифтов, в которой используются объ­екты класса TFont. Конструкторы этого класса принимают полтора десятка параметров, расположенных более или менее по степени их важности. Поскольку все они имеют значения по умолчанию, при вызове конструктора можно указывать только требуемое количество первых параметров, не заботясь об осталь­ных. При этом, разумеется, если нужно задать значение какого-либо параметра, то необходимо указать значения и всех параметров, расположенных перед ним. Для многих параметров значением по умолча­нию является ноль, хотя не во всех случаях это так. Прототип конструктора для класса TFont имеет сле­дующий вид:


Обработка сообщения WM_PAINT и интерфейс GDI 237

TFont(const char far* facename=0, //Имя шрифта
int height=0, //Высота

int width=0, //Средняя ширина

int escapement=0, //Угол наклона в 1/10 градуса

int orientation=0, //He используется

int weight=FW_NORMAL, //Жирность

uint8 pitchAndFamily=DEFAULT_PITCH|FF_DONTCARE, //Шаг и семейство
uint8 italic=false, //Курсив

uint8 underline=false, //Подчеркивание
uint8 strikeout=false, //Перечеркивание
uint8 charSet=1, //Набор символов

uint8 outputPrecision=OUT_DEFAULT_PRECIS, //Требуемая точность соответствия uint8 clipPrecision=CLIP_DEFAULT_PRECIS, //Способ вырезки части символа uint8 quality=DEFAULT_QUALITY) ;/1Качество

Подготовка нового шрифта осуществляется точно так же, как и для других инструментов рисования, именно, сначала требуемый шрифт создается вызовом конструктора, а затем его дескриптор выбирается в контекст устройства:

TFont font("Times New Roman",14);// Создаем шрифт для цифр под осью X dc.SelectObject(font);// Выбираем в контекст созданный шрифт

В приведенном фрагменте создается шрифт с именем Times New Roman размером 14 пунктов, который затем будет использован для вывода цифр масштаба. Остальные параметры принимаются по умолчанию.

Для надписывания графиков удобно использовать наклонные строки. Поэтому при создании трех следующих шрифтов (font1, font2 и font3) указываются уже не два, а четыре параметра, последний из ко­торых определяет наклон строк текста. Наклон экспериментально подобран так, чтобы надписи выводи­лись параллельно соответствующим графикам.

В определение шрифта не входит его цвет, для которого в контексте устройства предусмотрена от­дельная переменная, устанавливаемая функцией TDC::SetTextColor(). В отличие от процедуры загрузки в контекст устройства дескрипторов инструментов, в которой, как отмечалось выше, предусмотрено авто­матическое сохранение исходного дескриптора, для цвета шрифта такая операция не предусмотрена. По­этому если мы хотим в какой-то точке программы вернуться к исходному черному цвету шрифта, надо либо сохранить исходный цвет, либо в нужном месте установить его явным образом. В примере иллюст­рируется методика сохранения исходного цвета, который возвращается функцией SetTextColor(). В конце программы сохраненный дескриптор prevColor (типа TColor) снова загружается в контекст устройства, в результате чего подпись под графиком выводится черного цвета. При вызове конструктора логического шрифта для этой подписи (объект font4) указывается в общей сложности 8 параметров: имя шрифта, раз­мер в пунктах, константа FW_BOLD, образующая полужирное начертание и значение true для последне­го параметра, определяющее курсивное начертание.




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow