Главная » Delphi » Создание изображения в памяти

0

Создавая экземпляр класса TBitmap, следует заранее узнать его размер, чтобы  он мог разместить в памяти весь список  строк.  Этот размер можно  определить, умножив высо ту строки на их общее  количество. Функция  API GetTextMetrics(), которой в качест ве параметра передается дескриптор объекта Canvas (поверхности), предназначена для определения   размеров   строки   текста,   отображаемого   конкретным   шрифтом. В процессе выполнения эта функция заполняет данными запись TTextMetric:

var

Metrics: TTextMetric;

begin

GetTextMetrics(Canvas.Handle, Metrics);

НА ЗАМЕТКУ

Функция API GetTextMetrics() соответствующим образом модифицирует запись ти- па TTextMetric, содержащую много полезной информации о выбранном в данный момент шрифте контекста устройства. Эта функция предоставляет информацию не только о высоте и ширине шрифта, но и о его начертании: полужирном, курсиве, пере- черкнутом, о названии шрифта.

Метод TextHeight() класса TCanvas здесь не работает. Этот метод определяет только размеры конкретной строки текста, а не шрифта в целом.

Высота ячейки символа  в текущем шрифте хранится в поле tmHeight записи Met- ric. Если сложить это значение со значением поля  tmInternalLeading, хранящим межстрочное расстояние выбранного шрифта, то  получается высота  строки текста растрового изображения в памяти (memory canvas):

LineHi := Metrics.tmHeight + Metrics.tmInternalLeading;

Общая  высота  изображения в памяти определяется умножением значения LineHi на количество строк  и добавлением удвоенной высоты элемента управления TddgMarquee для создания пустого  изображения в начале  и конце  титров. Предпо ложим,  что  элемент типа  TStringList, в котором находятся все строки, носит  имя FItems. А теперь поместим все размеры изображения в структуру TRect:var

VRect: TRect;

begin

{ Прямоугольник Vrect – это растровое изображение в памяти }

VRect := Rect(0, 0, Width, LineHi * FItems.Count + Height * 2);

end;

После  того как в памяти будет создан  экземпляр растрового изображения необхо димого  размера, выполняется его  дальнейшая инициализация,  заключающаяся в ус тановке шрифта (значение свойства TddgMarquee.Font), цвета  фона  (Tddg- Marquee.Color) и стиля (Brush.Style) равным значению bsClear.

CОВЕТ

При размещении текста в объекте класса TCanvas цвет фона определяется значени- ем свойства TCanvas.Brush. Для того чтобы фон был невидимым, нужно установить свойство TCanvas.Brush.Style равным значению bsClear.

Итак, основная работа завершена, и теперь можно  поместить текст  в растровое изображение в памяти. Проще всего сделать  это с помощью метода  TextOut() класса TCanvas,  но   применение  функции   API  DrawText() предоставляет  существенно большие  возможности по управлению форматированием  текста.  Поскольку в компо ненте   TddgMarquee необходимо  управлять  выравниванием,   будет   использована именно эта функция. Для представления стилей выравнивания текста  идеально под ходит переменная перечислимого типа:

type

TJustification = (tjCenter, tjLeft, tjRight);

В следующем  фрагменте кода  показан метод  PaintLine() класса  TddgMarquee, позволяющий поместить текст  в изображение в памяти. В данном  методе  использует ся переменная FJust типа TJustification. Вот этот код:

procedure TddgMarquee.PaintLine(R: TRect; LineNum: Integer);

{ Этот метод помещает строки текста в область памяти MemBitmap. }

const

Flags: array[TJustification] of DWORD = (DT_CENTER,

DT_LEFT, DT_RIGHT);

var

S: string;

begin

{ Упростим код, скопировав очередную строку в локальную

переменную }

S := FItems.Strings[LineNum];

{ Прорисовать строку текста в изображение, размещенное в памяти}

DrawText(MemBitmap.Canvas.Handle, PChar(S), Length(S), R,

Flags[FJust] or DT_SINGLELINE or DT_TOP);

end;

Прорисовка компонента

Теперь, когда  уже известно, как создать  растровое изображение в памяти и по мещать  в него  текст,  можно  приступить к копированию этого  изображения на по верхность компонента TddgMarquee.

Метод Paint() компонента вызывается в ответ  на сообщение Windows WM_PAINT.

Именно метод  Paint() создает  эффект мультипликации. Он  позволяет рисовать на

поверхности компонента, формируя его визуальное представление.

Задача  метода  TddgMarquee.Paint() заключается в копировании строк  изобра жения из памяти на поверхность компонента TddgMarquee. Для этого  используется функция API BitBlt(), копирующая содержимое контекста одного  устройства в кон текст другого.

Для определения текущего  состояния компонента TddgMarquee используется ло гическая переменная FActive, указывающая, активизирован ли в данный момент процесс прокрутки. Очевидно, что метод  Paint() должен  работать по разному, в за висимости от того, активен данный компонент или нет:

procedure TddgMarquee.Paint;

{ Этот виртуальный метод вызывается в ответ на сообщение Windows о

необходимости перерисовки. }

begin

if FActive then

{ Копировать из памяти на экран. }

BitBlt(Canvas.Handle, 0, 0, InsideRect.Right,

InsideRect.Bottom, MemBitmap.Canvas.Handle,

0, CurrLine, srcCopy)

else

inherited Paint;

end;

Если компонент активен, то с помощью функции BitBlt() часть  хранимого в па мяти изображения отображается на экране в свойстве Canvas объекта TddgMarquee. Обратите внимание на переменную CurrLine, передаваемую функции BitBlt() как предпоследний параметр. Значение  этого  параметра определяет,  какую  часть  изо бражения в памяти нужно  выводить на экран.  Постоянно увеличивая или  уменьшая значение CurrLine, можно  добиться эффекта прокрутки текста  в компоненте TddgMarquee вниз или вверх.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии