![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте!
В момент выполнения программы изменяется Имя, Стиль, Размер шрифта и сама строка. Подскажите, как напечатать на Canvas'е текст в центре Canvas'a? И вторая задача. Дана прямоугольная область (Пусть TRect), как подобрать размер шрифта, чтобы строка (тип string) вписалась в эту область (по горизонтали и по вертикали). |
|
#2
|
||||
|
||||
|
Проще всего наверное использовать API-функцию DrawText. В ней предусмотрено нужное выравнивание, со 2 случаем несколько длиннее решение. Можно также использовать эту функцию, но уже в режиме подсчёта TRect. Плавно наращивая размер шрифта, добиться чтобы возвращаемяй Rect был приблизительно равен отдаваемому на проверку.
|
|
#3
|
|||
|
|||
|
Цитата:
Что значит возвращаемый Rect, какая функция его возвращает? |
|
#4
|
||||
|
||||
|
для 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
|
|||
|
|||
|
Спасибо, попробую. Я слишком силен в API, но разобраться стоит.
Я как раз хотел предложить печатать текст во временный TBitMap, а потов вызывать StretchDraw. По всей видимости, это что-то похожее. |
|
#6
|
||||
|
||||
|
Цитата:
Код:
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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
znseday (25.02.2012)
| ||
|
#7
|
|||
|
|||
|
Очень понравилась идея с DrawText, но, как оказалось, возвращаемый aRect по высоте намного больше, чем нужно для текста.
|
|
#8
|
||||
|
||||
|
Скорее всего неправильно указан Canvas, оттого и размер не тот.
|
|
#9
|
|||
|
|||
|
Та же проблема и с вариантом от NumLock. По вертикали прямоугольная область больше, чем нужно. Хотя этот вариант немного удобней в использовании, но возникают трудности с тем, чтобы задать настройки шрифта и цвет фона. С API функциями для этих дел не знаком. Предпочитаю TFont. Или тогда уже решать вопрос при помощи OpenGL...
|
|
#10
|
|||
|
|||
|
Кстати, DrawText при выводе на экран строки обрезает нижнюю часть прописных букв.
|