Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

// корректно в BDS2006 и выше. В этой версии у класса

// TFont появилось свойство Orientation, задающее

// направление текста, и этот класс научился определять

// и сохранять это направление даже в том случае, если

// оно было задано функцией GDI, а не через свойство

// Orientation. Чтобы этого не происходило, нужно снова

// придать шрифту горизонтальное направление. В версиях

// Delphi, более ранних, чем BDS 2006, эта строка

// не нужна: при изменении шрифта через класс TFont

// направление текста и так станет горизонтальным.

Canvas.Font.Handle := Create Font(60, 0, 0, 0, FW_NORMAL, 0, 0, 0,

 ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,

 DEFAULT_QUALITY, DEFAULT_PITCH, 'Times New Roman');

Новый

шрифт создается функцией
CreateFont
. Если бы мы программировали без VCL, то полученный в результате вызова этой функции дескриптор шрифта необходимо было бы выбрать в контексте устройства (функция
SelectObject
) и вывести надпись. Затем в устройстве следовало бы выбрать другой шрифт, а созданный ранее удалить. Но т.к. VCL мы все же используем, можно поступить проще: присвоить созданный дескриптор свойств
Canvas.Font.Handle
, а все остальное сделают классы
TCanvas
и
TFont
.

Примечание

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

Функция

CreateFont
имеет 14 параметров, определяющих свойства создаваемого шрифта. Мы не будем перечислять их все, отметим только, что мы здесь создаем шрифт на основе гарнитуры Times New Roman, имеющий размер 60 обычный (т.е. не жирный и не наклонный). О точных значениях всех параметров рекомендуем посмотреть в MSDN.

Самые интересные для нас параметры — это третий (

nEscapement
) и четвертый (
nOrientation
), которые и определяют угол наклона шрифта. Они задаются в десятых долях градуса, т.е., чтобы получить нужное значение параметра, следует требуемое число градусов умножить на 10) (в нашем примере оба эти параметра равны 600, что означает 60 градусов). Параметр
nEscapement
задает угол поворота базовой линии текста относительно горизонтальной оси. Параметр
nOrientation
задаст угол поворота отдельных букв относительно своего нормального положения. По умолчанию в контекст устройства включен режим
GM_COMPATIBLE
при котором эти два значения должны совпадать, т.е. угол поворота надписи в целом и угол поворота отдельной буквы всегда совпадают. В Windows NT/2000/ХР с помощью функции
SetGraphicsMode
можно установить для контекста устройства режим
GM_ADVANCED
, при котором, в частности, параметры (
nOrientation
и
nEscapement
могут принимать различные значения (в Windows 9х/МЕ тоже есть функция
SetGraphicsMode
, но установить режим
GM_ADVANCED
она не позволяет). Когда мы присваиваем значение свойству
TFont.Handle
, все прочие свойства объекта TFont меняют свои значения в соответствии с тем, какой шрифт установлен. Так как в Delphi до 7-й версии свойство
TFont.Orientation
отсутствует, направление шрифта, установленное нами, в этом классе не запоминается, и поэтому при дальнейшем изменении шрифта с помощью свойств
Canvas.Font.Name
,
Canvas.Font.Size
и т.п. мы снова получим горизонтальный шрифт. Другое дело — BDS 2006 и выше. В этих версиях направление шрифта тоже запоминается, и поэтому дальнейшие манипуляции со свойствами
Canvas.Font
будут снова давать наклонный шрифт, пока мы явно не присвоим значение 0 свойству
Canvas.Font.Orientation
. В нашем случае это означает, что при повторном вызове события
OnPaint
при вызове функции
GrayString
будет выведен наклонный текст, если не принять дополнительные меры. Как мы уже сказали, проблема легко решается присваиванием нуля свойству
Canvas.Font.Orientation
, но, т.к. наши примеры должны работать во всех версиях Delphi, начиная с пятой, этот вариант
нам не подходит. Поэтому мы здесь вновь вручную создаем шрифт, на этот раз не важно, какой именно, главное, чтобы его параметры
nOrientation
и
nEscapement
были равны нулю. В Delphi до 7-й версии программа GDIDraw будет корректно работать и без второго вызова функции
CreateFont
.

Отметим, что во всех версиях до Delphi 2007 как минимум, класс

TFont
имеет свойство
Orientation
, но не имеет свойства
Escapement
. Это означает, что если вы хотите вывести надпись, у которой угол наклона букв и угол наклона базовой линии будут разными, вам все-таки придется самостоятельно вызывать функцию
CreateFont
.

1.2.8. Пример BitmapSpeed

Программа BitmapSpeed предназначена для сравнения скорости работы с растровыми изображениями в формате DDB и DIB через класс

TBitmap
. Тестируются три операции: рисование прямых линий, вывод растра на экран и работа со свойством
ScanLine
. Окно программы показано на рис 1.12.

Рис. 1.12. Окно программы BitmapSpeed после завершения теста

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

DoTest
, показанном в листинге 1.40.

Листинг 1.40. Метод
DoTest
, выполняющий тесты скорости

procedure TForm1.DoTest(Cnt, XOfs, ColNum: Integer; PixelFormat: TPixelFormat);

{ Cnt - число повторов операции при тестах

 XOfs - X-координата области, в которой будет выполняться вывод изображения во втором тесте

 ColNum - номер колонки в GridResults, в которую будут выводиться результаты

 Pixel Format - формат изображения }

var

 Pict: TBitmap;

 I: Integer;

 P: Pointer;

 Freq, StartTime, EndTime: Int64;

begin

 // Узнаем частоту условного счетчика тактов

 QueryPerformanceFrequency(Freq);

 // Создаем изображение

 Pict := TBitmap.Create;

 try

Pict.PixelFormat := PixelFormat;

Pict.Width := PictSize;

Pict.Height := PictSize;

Pict.Canvas.Pen.Width := 0;

// Вывод линий на картинку

// Выводится Cnt линий со случайными координатами

QueryPerformanceCounter(StartTime);

for I := 1 to Cnt do

begin

Pict.Canvas.Pen.Color :=

RGB(Random(256), Random(256), Random(256));

Pict.Canvas.MoveTo(Random(PictSize), Random(PictSize));

Pict.Canvas.LineTo(Random(PictSize), Random(PictSize));

end;

QueryPerformanceCounter(EndTime);

GridResults.Cells[ColNum, 1] :=

FloatToStrF((EndTime - StartTime) / Freq * 1000, ffFixed, 10, 2);

// Вызываем Application.ProcessMessages, чтобы GridResults

// перерисовался в соответствии с новым значением ячейки

Application.ProcessMessages;

// Второй тест - вывод рисунка на экран

QueryPerformanceCounter(StartTime);

Поделиться:
Популярные книги

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Назад в СССР: 1986 Книга 5

Гаусс Максим
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Назад в СССР: 1986 Книга 5

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Не кровный Брат

Безрукова Елена
Любовные романы:
эро литература
6.83
рейтинг книги
Не кровный Брат

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл