Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI+. Позиционирование текста на холсте, DrawString. Выравнивание текста  
:(
    Опции темы
Desperate
Дата 5.7.2015, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Добрый день.
Не могу понять в чем причина. 

В общем функция выводит текст на Canvas Bitmap:
Код

function AddTextToImage(hBmp:int64; wdBMP, hdBMP:single; inText:PChar; inFont:shortString; SizeFont:integer; clrFont:TColor;
                            TextPos:TFPositions; Blend:byte):boolean;

begin

 graphic   := TGPGraphics.Create(hBmp);
  FontFamily := TGPFontFamily.Create(inFont);
  Font       := TGPFont.Create(FontFamily, SizeFont, FontStyleRegular, UnitPoint);


GetTextExtentPoint32(hBmp,inText,Length(inText), txtSize); //получаем длину и высоту строки 

GPPoint:=MakePoint(wdBMP-txtSize.cx, hdBMP-txtSize.cy);



SolidBrush := TGPSolidBrush.Create(MakeColor(Blend, GetRValue(clrFont), GetGValue(clrFont), GetBValue(clrFont)));   
graphic.SetTextRenderingHint(TextRenderingHintAntiAlias); 

graphic.DrawString(inText, -1, Font, GPPoint, solidBrush); 

  graphic.Free;
  FontFamily.Free;
  Font.Free;
  SolidBrush.Free;

end;


Все хорошо. Выводит. Но с разными шрифтами получаю следующее:
user posted imageuser posted imageuser posted image

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

Это сообщение отредактировал(а) Desperate - 5.7.2015, 23:42
PM MAIL   Вверх
Doga
Дата 6.7.2015, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



Привет.

Похоже, GetTextExtentPoint32(...) не знает, что Вы собираетесь использовать другой шрифт.

Перед измерением размеров шрифта, попробуйте установить его для hBmp с помощью SelectObject(...).
PM MAIL WWW   Вверх
Desperate
Дата 6.7.2015, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Приветствую.
Проделал следующее:
Код


hFont:=TFont.Create;
  hFont.Size :=SizeFont;
  hFont.Name:=inFont;

   SelectObject(hBmp,hFont.Handle);

GetTextExtentPoint32(hBmp,inText,Length(inText), txtSize);
.....


Ничего не изменилось. 
Я верно понял? (извиняюсь, GDI API только осваиваю, мозг уже плавится).

Возможно ли, что дело в самих шрифтах т.е. в их типах?

К примеру Arial, Times New Roman, Tahoma, Trebushet нормально прижимаются к нижнему правому краю, а например "Berlin Sans FB" выползает за границы.
PM MAIL   Вверх
Doga
Дата 8.7.2015, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



У меня всё работает:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    FormFontSize: Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FormFontSize := 8;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FormFontSize < 30 then
  begin
    Inc(FormFontSize);
  end
  else
  begin
    FormFontSize := 8;
  end;

  Invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  FormDC: HDC;
  FormText: string;
  FormFont: TFont;
  TextSize: SIZE;

begin
  FormFont := TFont.Create();
  FormFont.Size := FormFontSize;
  FormFont.Name := 'Lucida Sans Unicode'; //Любой, какой есть в системе

  FormText := 'Нижний правый угол';

  FormDC := GetDC(Self.Handle);

  SelectObject(FormDC, FormFont.Handle);

  SetTextColor(FormDC, clRed);

  GetTextExtentPoint32(FormDC, PChar(FormText),  Length(FormText), &TextSize);

  TextOut(FormDC, Self.ClientWidth - TextSize.cx - 2, Self.ClientHeight - TextSize.cy - 2, PChar(FormText), Length(FormText));

  ReleaseDC(Self.Handle, FormDC);
end;

end.


user posted image

Не нашёл в Вашем примере объявление переменной txtSize, которая используется при вызове функции GetTextExtentPoint32(hBmp,inText,Length(inText), txtSize).
Туда она должна быть передана как указатель на структуру SIZE. Проверьте возвращаемое этой функцией значение.



Это сообщение отредактировал(а) Doga - 8.7.2015, 15:22
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1171 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.