Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как изменить шрифт на канве в Delphi/Pascal: практическое руководство и поиск альтернативных шрифтов.

Delphi , Графика и Игры , Шрифты

 

В разработке графических приложений на Delphi и Pascal часто возникает задача отображения текста на канве (Canvas) с использованием различных шрифтов. В этой статье мы рассмотрим, как изменить шрифт на канве, а также как найти и использовать альтернативные шрифты, если нужный шрифт отсутствует в системе.

Проблема:

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

Решение:

  1. Использование TBitmap.Canvas:

В Delphi и Pascal для рисования на канве обычно используется объект TBitmap.Canvas. Чтобы изменить шрифт, используемый для рисования текста, необходимо изменить свойства объекта TBitmap.Canvas.Font.

var img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;

 // Изменение шрифта
 img.Canvas.Font.Name := 'Arial'; // Указываем имя шрифта
 img.Canvas.Font.Size := 12;  // Указываем размер шрифта
 img.Canvas.Font.Color := clBlack; // Указываем цвет шрифта

 img.Canvas.TextOut(0, 0, 'Привет, мир!');

end;

  1. Проверка доступности шрифта:

Перед тем, как установить шрифт, рекомендуется проверить, доступен ли он в системе. Для этого можно использовать свойство Screen.Fonts, которое возвращает список установленных шрифтов.

function FontExists(const FontName: string): Boolean;
var i: Integer;
begin
Result := False;
for i := 0 to Screen.Fonts.Count - 1 do
begin
if SameText(Screen.Fonts[i], FontName) then
begin
Result := True;
Exit;
end;
end;
end;

var img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;

 if FontExists('Arial') then
 begin
   img.Canvas.Font.Name := 'Arial';
 end else
 begin
   // Используем шрифт по умолчанию или альтернативный шрифт
   img.Canvas.Font.Name := 'Tahoma';
 end;

 img.Canvas.Font.Size := 12;
 img.Canvas.Font.Color := clBlack;

 img.Canvas.TextOut(0, 0, 'Привет, мир!');

end;

  1. Поиск альтернативных шрифтов:

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

function FindFontOrReplacement(SimilarFonts: String): String;
var
fonts: TStringArray;
i: Integer;
begin
fonts := SimilarFonts.Split([',', ';', #13, #10, #9]); // Разделители в списке шрифтов
for i := 0 to High(fonts) do
if Screen.Fonts.IndexOf(trim(fonts[i])) > 0 then
begin
Result := fonts[i];
exit;
end;
Result := ''; // Шрифт не найден
end;

var
img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;

 // Поиск альтернативного шрифта
 img.Canvas.Font.Name := FindFontOrReplacement('Arial;Liberation Sans;Noto Sans');

 if img.Canvas.Font.Name = '' then
 begin
   // Ни один из шрифтов не найден, используем шрифт по умолчанию
   img.Canvas.Font.Name := 'default';
 end;

 img.Canvas.Font.Size := 12;
 img.Canvas.Font.Color := clBlack;

 img.Canvas.TextOut(0, 0, 'Привет, мир!');

end;

  1. Использование fpTTF (для более сложных задач):

В контексте обсуждения упоминается модуль fpTTF, который предназначен для работы со шрифтами TrueType. Этот модуль может быть полезен, если требуется более тонкий контроль над отображением шрифтов, например, при работе с PDF-файлами или при необходимости использования шрифтов, которые не установлены в системе, а загружаются из файла. Однако, для простых задач, таких как изменение шрифта на канве, обычно достаточно использовать стандартные средства Delphi/Pascal. fpTTF может быть избыточным.

Альтернативное решение (использование TFontDialog):

Для интерактивного выбора шрифта пользователем можно использовать компонент TFontDialog.

uses
  ..., FontDialogs;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FontDialog1.Font := Image1.Picture.Bitmap.Canvas.Font; // Инициализируем текущим шрифтом
  if FontDialog1.Execute then
  begin
    Image1.Picture.Bitmap.Canvas.Font := FontDialog1.Font;
    Image1.Repaint; // Перерисовываем Image
  end;
end;

Это позволит пользователю выбрать шрифт, размер и стиль из стандартного диалогового окна выбора шрифта.

Заключение:

Изменение шрифта на канве в Delphi и Pascal - достаточно простая задача. Однако, важно учитывать возможность отсутствия нужного шрифта в системе пользователя и предусмотреть альтернативные варианты, такие как поиск похожих шрифтов или использование шрифта по умолчанию. Функция FindFontOrReplacement и компонент TFontDialog предоставляют удобные инструменты для решения этой проблемы. Выбор конкретного метода зависит от требований вашего приложения и сложности задачи.

Создано по материалам из источника по ссылке.

В статье рассматривается изменение шрифта на канве в Delphi/Pascal, включая проверку доступности шрифта, поиск альтернативных вариантов и использование компонента TFontDialog для интерактивного выбора шрифта пользователем.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 17:14:06
2025-10-15 13:46:51/0.011218070983887/0