Карта сайтаСсылкиКонтакты

Вывод выделенного текста

PDF Печать
Статьи

Мы можем рисовать выделенный и заполненный текст, если используем векторный шрифт.

Следующая функция рисует текст на холсте и выделяет его текущим пером холста и заполняет его текущей кистью холста:


procedure DrawTextOutline(
   const Canvas: TCanvas; const X, Y: Integer;
   const Text: string);
var
  OldBkMode: Integer;  // хранит предыдущий режим фона
begin
  OldBkMode := SetBkMode(Canvas.Handle, TRANSPARENT);
  BeginPath(Canvas.Handle);
  Canvas.TextOut(X, Y, Text);
  EndPath(Canvas.Handle);
  StrokeAndFillPath(Canvas.Handle);
  SetBkMode(Canvas.Handle, OldBkMode);
end;

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

Затем мы передаем текст как путь Windows (между вызовами API BeginPath и EndPath).

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

И наконец, восстанавливаем фоновый режим. Есть версия DrawTextOutline в Code Snippets Database.

Пример

В этом примере мы отобразим текст Hello World! шрифтом True Type и нарисуем его с темной синей пунктирной линией и заштрихованным фэйсом.

Запустите новое приложение VCL и создайте событие OnPaint для формы:


procedure TForm1.FormPaint(Sender: TObject);
const
  cText = 'Hello World!';
begin
  Canvas.Font.Name := 'Comic Sans MS';
  Canvas.Font.Style := [fsBold];
  Canvas.Font.Size := 48;
  Canvas.Brush.Color := clSkyBlue;  // $F0CAA6
  Canvas.Brush.Style := bsDiagCross;
  Canvas.Pen.Color := clNavy;
  Canvas.Pen.Style := psDot;
  DrawTextOutline(Canvas, 0, 0, cText);
end;

Это выглядит несколько уныло из-за цвета окна. Мы можем изменить это, нарисовав текст дважды.

Измените FormPaint как ниже:


procedure TForm1.FormPaint(Sender: TObject);
const
  cText = 'Hello World!';
begin
  Canvas.Font.Name := 'Comic Sans MS';
  Canvas.Font.Style := [fsBold];
  Canvas.Font.Size := 48;
  // начало добавленного кода
  Canvas.Brush.Color := clWhite;
  Canvas.Pen.Style := psClear;
  DrawTextOutline(Canvas, 0, 0, cText);
  // конец добавленного кода
  Canvas.Brush.Color := clSkyBlue;  // $F0CAA6
  Canvas.Brush.Style := bsDiagCross;
  Canvas.Pen.Color := clNavy;
  Canvas.Pen.Style := psDot;
  DrawTextOutline(Canvas, 0, 0, cText);
end;

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

Автор: Peter Johnson


 

Добавить комментарий


Защитный код
Обновить