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