|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
Цитата:
Код:
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)
|
#6
|
|||
|
|||
Спасибо, попробую. Я слишком силен в API, но разобраться стоит.
Я как раз хотел предложить печатать текст во временный TBitMap, а потов вызывать StretchDraw. По всей видимости, это что-то похожее. |
#7
|
|||
|
|||
Очень понравилась идея с DrawText, но, как оказалось, возвращаемый aRect по высоте намного больше, чем нужно для текста.
|
#8
|
||||
|
||||
Скорее всего неправильно указан Canvas, оттого и размер не тот.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
Как его можно указать неправильно? Просто на форме тестирую. Пишу Canvas.Handle
|
#10
|
|||
|
|||
Та же проблема и с вариантом от NumLock. По вертикали прямоугольная область больше, чем нужно. Хотя этот вариант немного удобней в использовании, но возникают трудности с тем, чтобы задать настройки шрифта и цвет фона. С API функциями для этих дел не знаком. Предпочитаю TFont. Или тогда уже решать вопрос при помощи OpenGL...
|
#11
|
||||
|
||||
Размер Rect-а рассчитывется от размера шрифта для данного Canvas-а, соответственно для одного Canvas-а нельзя указать разные размеры шрифта - другие надписи "поплывут".
Скажи толком, что нужно получить. Может другие варианты стоит попробовать. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
Кстати, DrawText при выводе на экран строки обрезает нижнюю часть прописных букв.
|
#13
|
|||
|
|||
Пользователь выделяет прямоугольную область на экране (знаем Rect), выбирает параметры шрифта (кроме размера), пишет строку (несколько символов). Эта строка должна быть отцентрирована внутри заданного Rect, при этом размер шрифта должен быть максимально большим, но таким, чтобы надпись ни при каких обстоятельствах не вылезла за Rect.
|
#14
|
||||
|
||||
Кстати, если посмотреть исходники Дельфи, то можно увидеть, что для вывода текста использются функции DrawText и ExtTextOut и ничего при этом не обрезают. Ищите ошибку. Как я подозреваю, вы так и не поняли взаимосвязь Canvas-а и выбранного в него в данный момент шрифта.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
|||
|
|||
Код:
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; |