Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.02.2012, 18:19
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию Как отцентрировать текст и подобрать размер шрифта?

Здравствуйте!
В момент выполнения программы изменяется Имя, Стиль, Размер шрифта и сама строка. Подскажите, как напечатать на Canvas'е текст в центре Canvas'a?
И вторая задача. Дана прямоугольная область (Пусть TRect), как подобрать размер шрифта, чтобы строка (тип string) вписалась в эту область (по горизонтали и по вертикали).
Ответить с цитированием
  #2  
Старый 25.02.2012, 21:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Проще всего наверное использовать API-функцию DrawText. В ней предусмотрено нужное выравнивание, со 2 случаем несколько длиннее решение. Можно также использовать эту функцию, но уже в режиме подсчёта TRect. Плавно наращивая размер шрифта, добиться чтобы возвращаемяй Rect был приблизительно равен отдаваемому на проверку.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 25.02.2012, 22:01
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Плавно наращивая размер шрифта, добиться чтобы возвращаемяй Rect был приблизительно равен отдаваемому на проверку.

Что значит возвращаемый Rect, какая функция его возвращает?
Ответить с цитированием
  #4  
Старый 25.02.2012, 22:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

для 2-ой задачи используй метафайл:

Код:
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);

procedure TForm1.FormCreate(Sender: TObject);

  procedure DrawTextEnhMetaFile(ACanvas: TCanvas; ARect: TRect; const s: String);
  var
    hEnhDC: HDC;
    hMetaFile: HENHMETAFILE;
    hObj: HGDIOBJ;
  begin
    hEnhDC:=CreateEnhMetaFile(0, nil, nil, nil);
    hObj:=SelectObject(hEnhDC, Font.Handle);
    TextOut(hEnhDC, 0, 0, PChar(s), Length(s));
    if hObj<>0 then SelectObject(hEnhDC, hObj);
    hMetaFile:=CloseEnhMetaFile(hEnhDC);
    PlayEnhMetaFile(ACanvas.Handle, hMetaFile, ARect);
    DeleteEnhMetaFile(hMetaFile);
  end;

begin
  DrawTextEnhMetaFile(Image1.Canvas, Rect(0, 0, Image1.ClientWidth, Image1.ClientHeight), 'Rect');
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
znseday (25.02.2012)
  #5  
Старый 25.02.2012, 22:24
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Спасибо, попробую. Я слишком силен в API, но разобраться стоит.
Я как раз хотел предложить печатать текст во временный TBitMap, а потов вызывать StretchDraw. По всей видимости, это что-то похожее.
Ответить с цитированием
  #6  
Старый 25.02.2012, 22:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от znseday
Что значит возвращаемый Rect, какая функция его возвращает?
DrawText и возвращает:
Код:
var
  aRect : TRect;
begin
  aRect := Rect(0, 0, 100, 24); // к примеру такой Rect
  DrawText(Canvas.Handle, 'Строка', -1, aRect, DT_CENTER or DT_VCENTER	 or DT_SINGLELINE	or DT_CALCRECT);
end;
При выбранном размере шрифта и указанном красным цветом флаге, aRect возвратит актуальный размер, требуемый для вывода текста. Далее выводится сам текст уже без указанного флага.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
znseday (25.02.2012)
  #7  
Старый 25.02.2012, 22:49
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Очень понравилась идея с DrawText, но, как оказалось, возвращаемый aRect по высоте намного больше, чем нужно для текста.
Ответить с цитированием
  #8  
Старый 25.02.2012, 23:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Скорее всего неправильно указан Canvas, оттого и размер не тот.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 25.02.2012, 23:49
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Та же проблема и с вариантом от NumLock. По вертикали прямоугольная область больше, чем нужно. Хотя этот вариант немного удобней в использовании, но возникают трудности с тем, чтобы задать настройки шрифта и цвет фона. С API функциями для этих дел не знаком. Предпочитаю TFont. Или тогда уже решать вопрос при помощи OpenGL...
Ответить с цитированием
  #10  
Старый 25.02.2012, 23:57
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Кстати, DrawText при выводе на экран строки обрезает нижнюю часть прописных букв.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025