Форум по 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: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)
  #6  
Старый 25.02.2012, 22:24
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Спасибо, попробую. Я слишком силен в API, но разобраться стоит.
Я как раз хотел предложить печатать текст во временный TBitMap, а потов вызывать StretchDraw. По всей видимости, это что-то похожее.
Ответить с цитированием
  #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:37
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

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

Та же проблема и с вариантом от NumLock. По вертикали прямоугольная область больше, чем нужно. Хотя этот вариант немного удобней в использовании, но возникают трудности с тем, чтобы задать настройки шрифта и цвет фона. С API функциями для этих дел не знаком. Предпочитаю TFont. Или тогда уже решать вопрос при помощи OpenGL...
Ответить с цитированием
  #11  
Старый 25.02.2012, 23:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

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

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

Пользователь выделяет прямоугольную область на экране (знаем Rect), выбирает параметры шрифта (кроме размера), пишет строку (несколько символов). Эта строка должна быть отцентрирована внутри заданного Rect, при этом размер шрифта должен быть максимально большим, но таким, чтобы надпись ни при каких обстоятельствах не вылезла за Rect.
Ответить с цитированием
  #14  
Старый 26.02.2012, 00:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Кстати, если посмотреть исходники Дельфи, то можно увидеть, что для вывода текста использются функции DrawText и ExtTextOut и ничего при этом не обрезают. Ищите ошибку. Как я подозреваю, вы так и не поняли взаимосвязь Canvas-а и выбранного в него в данный момент шрифта.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #15  
Старый 26.02.2012, 00:28
znseday znseday вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 31
Версия Delphi: 2010
Репутация: 10
По умолчанию

Код:
procedure TForm2.Button1Click(Sender: TObject);
var
 aRect : TRect;
  s: string;
begin
  s:= '7чудДW8';
  aRect := Rect(40, 40, 50, 50);

  Canvas.Font.Name := 'Comic Sans MS';
  Canvas.Font.Color := clRed;
  canvas.Brush.Color := clGreen;

  Canvas.Font.Size := 72;
  DrawText(Canvas.Handle, s, -1, aRect, DT_CENTER or DT_VCENTER	 or DT_SINGLELINE	or DT_CALCRECT);
  Canvas.Rectangle(aRect);
  DrawText(Canvas.Handle, s, -1, aRect, DT_CENTER or DT_VCENTER	 or DT_SINGLELINE);

  aRect := Rect(40, 200, 200, 210);

  Canvas.Font.Size := 14;
  DrawText(Canvas.Handle, s, -1, aRect, DT_CENTER or DT_VCENTER	 or DT_SINGLELINE	or DT_CALCRECT);
  Canvas.Rectangle(aRect);
  DrawText(Canvas.Handle, s, -1, aRect, DT_CENTER or DT_VCENTER	 or DT_SINGLELINE);

end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter