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

Совместительство стилей шрифтов: вертикальное центрирование текста в программировании на Delphi

Delphi , Синтаксис , Текст и Строки

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

Проблема

При использовании функции DrawText с флагами DT_SINGLELINE, DT_LEFT или DT_VCENTER для отображения текста с различными стилями шрифтов, вертикальное центрирование не выполняется одинаково для жирных и обычных символов. Это приводит к тому, что текст отображается неравномерно, что видно на представленном пользователем изображении.

Подход к решению

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

Пример кода

uses
  Winapi.Windows;

// Функция для вертикального центрирования текста с разными стилями шрифтов
procedure DrawCenteredText(hDC: HDC; const Text: string; const FontName: string; const FontStyle: TFontStyles; const Color: TColor; const x, y, cx, cy: Integer);
var
  Font: TFont;
  LogFont: TLogFont;
  TextMetrics: TTextMetric;
  Rect: TRect;
  VOffset: Integer;
begin
  Font := TFont.Create;
  with Font do
  begin
    Name := FontName;
    Size := 10;
    Style := [fsBold shl Ord(FontStyle and [fsBold])] or [fsRegular shl Ord(FontStyle and [fsRegular])];
    Color := Color;
    Assign(Font, CreateFontIndirect(LogFont));
    Assign(hDC, SelectObject(hDC, Font));
  end;
  try
    Rect := Rect(x, y, x + cx, y + cy);
    InflateRect(Rect, [-1, -1]);
    GetTextMetrics(hDC, TextMetrics);
    VOffset := (Rect.Bottom - Rect.Top - TextMetrics.tmHeight) div 2;
    if VOffset < 0 then
      VOffset := 0;
    TextOut(hDC, Rect.Left, Rect.Top + VOffset, Text, Length(Text));
  except
    on E: Exception do
      MessageDlg('Ошибка при рисовании текста: ' + E.ClassName, mtError, [mbOK], 0);
  end;
  finally
    Assign(hDC, SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)));
    Font.Free;
  end;
end;

var
  DC: HDC;
  hBitmap: HBITMAP;
  Bitmap: TBitmap;
  Text: string;
  Style: TFontStyles;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.HandleType := btDIB;
    Bitmap.PixelFormat := pf32bit;
    Bitmap.SetSize(800, 600);
    hBitmap := Bitmap.Handle;
    DC := GetDC(0);
    DC := CreateCompatibleDC(DC);
    SelectObject(DC, hBitmap);
    Text := 'Пример текста с различными стилями: АоBуCд'; // Пример строки с гласными и согласными
    Style := [fsBold, fsRegular]; // Массив стилей для жирного и обычного шрифта
    with Text do
    begin
      SetLength(Self, Length(Self) * 2); // Увеличиваем размер строки для хранения атрибутов
      var
        Index: Integer;
        Char: Char;
      begin
        Result[0] := #0;
        Index := 1;
        for var i := 1 to Length(Self) do
        begin
          Char := Self[i];
          Case Char of
            'А', 'а', 'Е', 'е', 'И', 'и', 'О', 'о', 'У', 'у', 'Ы', 'ы', 'Э', 'э', 'Ю', 'ю', 'Я', 'я':
              Result[Index] := Char;
              Result[Index + 1] := #0A; // Атрибут жирный
              Inc(Index, 2);
            else
              begin
                Result[Index] := Char;
                Result[Index + 1] := #0; // Атрибут обычный
                Inc(Index);
              end;
          end;
        end;
      end;
    end;
    // Перебор стилей для каждого символа
    var
      CharIndex,
      TextIndex: Integer;
      Char: Char;
      FontStyle: Integer;
    begin
      CharIndex := 1;
      TextIndex := 1;
      while Text[TextIndex] <> #0 do
      begin
        Char := Text[TextIndex];
        Inc(TextIndex);
        FontStyle := Ord(Text[TextIndex] = #0A);
        Inc(TextIndex);
        DrawCenteredText(DC, Char, 'Arial', FontStyle, clBlack, 0, 0, 100, 100);
        // Увеличиваем координату X для следующего символа
        CharIndex := CharIndex + (FontStyle = 0) * 100 div 3;
        MoveToEx(DC, CharIndex, 0, NULL);
      end;
    end;
    // Освобождение ресурсов
    DeleteObject(SelectObject(DC, GetStockObject(DEFAULT_GUI_FONT)));
    DeleteDC(DC);
    ReleaseDC(0, DC);
  finally
    Bitmap.SaveToFile('C:\temp\Bitmap.bmp');
    Bitmap.Free;
  end;
end;

Обсуждение альтернативного ответа

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

Подтвержденный ответ

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

Заключение

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

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

Совместительство стилей шрифтов с вертикальным центрированием текста в программировании на Delphi требует учета изменений метрик текста при смене стиля шрифта для корректного отображения.


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

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




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


:: Главная :: Текст и Строки ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 08:56:38/0.0054049491882324/1