Вывод выделенного текста
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
Комментарии