Практика программирования (Бейсик, Си, Паскаль)

       

Текстовые сообщения в графическом режиме


Возможностью вывода пояснительных подписей, сопровождающих графические изображения, располагает каждая из рассматриваемых систем. 0днако в системе QBasic отсутствуют средства по управлению шрифтами, масштабированию и точному (до пиксела) позиционированию текстов. В графическом режиме QBasic разрешает использование обычного оператора PRINT, который выводит тексты по правилам текстового режима.

Гораздо более богатыми возможностями располагает BGI-пакет, предоставляющий в распоряжение пользователя набор различных шрифтов и средства по управлению ими.

Собственно вывод текстовых сообщений осуществляется двумя процедурами (функциями):

outtext(сообщение); outtextxy(x,у,сообщение);

В первом случае место расположения текста на экране задается позицией СР, которая после вывода перемещается за последний символ сообщения. Во втором случае точка привязки текста явно задается координатами в окне вывода. После работы процедуры outtextxy позиция СР не изменяется.

Существует девять способов расположения точки привязки текста относительно габаритного прямоугольника, окаймляющего выводимое сообщение (рис. 8.1).

Рис. 8.1. Расположение возможных точек привязки текста

По каждой из. координат можно выбрать нижнюю, среднюю, верхнюю, левую или правую оси, пересечением которых и является точка привязки выводимого текста. По умолчанию в качестве точки привязки считается левый верхний угол габаритного прямоугольника. Выбор любой другой точки привязки осуществляется с помощью процедуры settextjustify:

SetTextJustify(horiz,vert) ;

Каждый из ее параметров может принимать одно из трех значений:

  • 0 — снизу (воттом_ТЕХТ) или слева (LEFT_TEXT>;

  • 1 — П0 центру (CENTER_TEXT) ;



  • 2 — сверху (T0P_TEXT) или справа (RIGHTJTEXT) .

    Учтите, что если какая-либо часть отображаемой буквы выходит за пределы экрана, то в растровом шрифте она вообще не рисуется, а в векторном рисуется либо ее часть, либо буква целиком, если режим отсечения заблокирован.

    В состав базовой поставки Borland-систем программирования входит 11 шрифтов, среди которых шрифт по умолчанию (DEFAULT_F0NT) относится к растровым, а остальные — к векторным. Символы растрового шрифта формируются из точек, образованных единичными битами в мини-растре 8x8 пикселов. Для организации зазоров между символами и строками в этом мини-растре правый столбец и нижняя строка оставляются пустыми. По мере увеличения размеров букв составляющие их точки превращаются в заметные квадратики, что существенно ухудшает контуры символов. Векторные шрифты цредставлены набором отрезков, концы которых располагаются в узлах растровой сетки экрана. При увеличении размеров букв длины отрезков, образующих контур, увеличиваются, сохраняя пропорции и не ухудшая качество изображения.




    Векторные шрифты обеспечивают довольно разнообразное представление алфавита. Самые примитивные из них (например, SMALL_F0NT) формируют контур в одну линию, и при увеличении таких букв их толщина не меняется. Более красивые (например, SANS_SERIF_F0NT) используют двухконтурные модели букв, при увеличении которых до определенного размера толщина контура заметно увеличивается. Но при большем увеличении между внутренним и внешним контурами начинают проглядывать фоновые пикселы. Наиболее качественные шрифты (например, TRIPLEX_F0NT или G0THIC_F0NT) "для создания разнотолщинных элементов контура используют до трех векторов на линию (рис. 8.2).









    Рис. 8.2. Увеличенное изображение буквы в,разных шрифтах

    Векторные шрифты, входящие в состав фирменной поставки ВС 3.1 и ТР 7.0, вместо контуров букв русского алфавита содержат экзотические символы европейских шрифтов (буквы с умляутами из немецкого, особые буквы чешского и польского алфавитов и т. п.). 0днако наши умельцы давным-давно модернизировали фирменные шрифты, пополнив их русскими буквами в соответствии с 866-й кодовой страницей. Найти русифицированные файлы с расширением chr особого труда не составляет.

    Назначение шрифта, которым программа собирается выводить текстовые сообщения, производится с помощью процедуры settextstyle:

    SetTextStyle(font,dir,size);

    Параметр font определяет номер шрифта — число из диапазона от 0 до 10 — и может быть задан одной из мнемонических констант (табл. 8.3).

    Таблица 8.3, Мнемонические константы шрифтов

    Номер шрифта

    Константа ТС

    Константа ТР

    Пояснение

    0

    DEFAULT F0NT

    DefaultFont

    Растровый, 8x8

    1

    TRIPLEX_F0NT

    TriplexFont

    Трехобводный с засечками

    2

    SMALL F0NT

    SmallFont

    0днообводный, грубый

    3

    SANS_SERIF_F0NT

    SansSerif Font

    Двухобводный, равнотолщинный

    4

    G0THIC F0NT

    GothicFont

    Готический, трехобводный

    5

    SCRIPT_F0NT

    Мнемоника отсутствует

    Рукописный, однообводный

    6

    SIMPLEX F0NT

    Мнемоника отсутствует

    0днообводный

    7

    TRIPLEX SCR F0NT

    Мнемоника отсутствует

    Курсив, трехобводный

    <


    Номер шрифта

    Константа ТС

    Константа ТР

    Пояснение

    8

    C0MPLEX_F0NT

    Мнемоника отсутствует

    Двухобводный, разнотолщинный

    9

    EUR0PEAN F0NT

    Мнемоника отсутствует

    0днообводный

    10

    B0LD_F0NT

    Мнемоника отсутствует

    Жирный, равнотолщинный

    Параметр dir принимает всего два значения — 0 (мнемоническая константа H0RIZ_DIR) или 1 (VERT_DIR). В первом случае устанавливается режим воспроизведения горизонтальных надписей, во втором — повернутых на 90° против часовой стрелки. Последнее может оказаться полезным для подписи вертикальных осей на графиках.

    Третий параметр size, значения которого должны принадлежать интервалу [1,10], выполняет роль масштабного коэффициента, с помощью которого можно незначительно увеличивать (size > 4) или уменьшать (size < 4) размеры букв.

    Гораздо более гибкое управление размерами букв в векторных шрифтах обеспечивает процедура setusercharsize:

    SetUserCharSize(mx,dx,my,dy);

    Ее целочисленные аргументы выполняют роль множителей и делителей для координат (х,у) каждой точки контура букв:

    X=x*mx/dx; Y=y*my/dy;

    Выбирая те или иные значения этих параметров, можно осуществить раздельное масштабирование по каждой оси, сделав, например, узкие или широкие буквы. Коэффициент увеличения можно довести до такого значения, при котором единственная буква занимает весь экран с четко различимыми элементами ее контура.

    С помощью функций textwidth и textheight, единственным параметром которых является текстовая строка, можно определить ширину и высоту габаритного прямоугольника в пикселах. Предварительное знание размеров подписи может оказаться полезным при выборе места ее расположения в последующей процедуре outtextxy.

    В качестве примера ниже приводится программа, с помощью которой были получены изображения букв на рис. 8.2. Подбор некоторых параметров этой программы был сделан экспериментальным путем. Сначала была выбрана линия строки, на которой должны были располагаться буквы разных шрифтов (у = 470). Затем путем подбора коэффициентов увеличения были установлены приемлемые габариты буквы А для шрифта SMALL_F0NT. Получившиеся при этом "круглые" размеры габаритного прямоугольника (w = 180, h =270) были использованы для определения масштабного коэффициента шрифтовSANS_SERIF_F0NT И TRIPLEX_F0NT. После нескольки пристрелочных проб, дававших "перелеты" и "недолеты", были найдены подходящие коэффициенты для каждого из шрифтов. Подбирать их пришлось по каждой оси свой и с точностью до второго знака после запятой. 0братите внимание на то, что одним и тем же коэффициентом не всегда удается выровнять размеры букв в разных шрифтах. 0бъясняется это тем, что разработка контуров векторных шрифтов выполнялась на координатных сетках с разными шагами. Более того, трансляция этой программы в системах ТС 2.0 и ВС 3.1 дает разные результаты т. к. в каждой из систем используются свои наборы шрифтов, которые слегка отличаются по начертаниям букв.



    Самые большие неприятности доставил шрифт DEFAULT_F0NT. Для него нельзя использовать функцию setusercharsize после выбора шрифта (settextstyie). Для того чтобы растровая буква оказалась на линии строки, ее пришлось опустить на межстрочный промежуток, равный 1 пикселу (с учетом масштабного множителя — на 10 пикселов).

    Программа 8_13.с

    /* Буква "А" в разных шрифтах */

    #include <stdio.h>

    #include <conio.h>

    #include <graphics.h>

    int x,y=470;

    void a_in_box(int dy) {

    int w,h; /* 0пределение размеров габаритного прямоугольника */

    w=textwidth("А");

    h=textheight("А");

    printf("w=%d h=%d ",w,h);

    /* 0бводка границ прямоугольника со смещением на 2 пиксела */

    rectangle(x-2,y-h,x+w-2,y+2); /* Вывод буквы А */

    outtextxy(x,y+dy,"A"); }

    main()

    {

    int gd=0,gm;

    initgraph(&gd,&gm,""); /* Установки для рисования черным по белому */

    setpalette(l,0);

    setcolor(1);

    setbkcolor(15);

    settextjustify(0,0);

    settextstyle(2,0,l); /* SmallFont */

    setusercharsize(30,1,267,1);

    x=4;

    a_in_box(0);

    settextstyle(3,0,1); /* SansSerifFont */

    setusercharsize(86,10,75,10);

    x=186;

    a_in_box(0);

    settextstyle (1,0,1); /* TriplexFont */

    setusercharsize(95,10,78,10);

    x=368;

    a_iri_box(0);

    settextstyle(0,0,10); /* DefaultFont, общее увеличение=10 */

    x=550;

    a_in_box(10);

    getch ();

    closegraph(); }




    Содержание раздела