Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Вывод текста в заданном прямоугольнике   Найти похожие ветки 

 
Digitman ©   (2005-06-01 13:43) [40]


> pudel   (01.06.05 13:31) [35]


> Ну И ?


что "ну И" ?

при чем здесь Label.Width/Height ?

речь идет о TFont.Height


 
pasha_golub ©   (2005-06-01 13:45) [41]

Лана. Предлагаю, чтобы было быстро искать не последовательным перебором, как советовал ЮЗ. А с помощью дихотомии, тобто метода половинного деления.

Уверен, что кол-во итераций будет меньше 10.


 
Mx ©   (2005-06-01 13:49) [42]

Я тоже что-то мало понимаю о чем вообще речь.

Объяснили же, используя DrawText с константой DT_CALCRECT можно определить требуемый прямоугольник. Значит изменяя размер и вызывая DrawText ты можешь посмотреть какой из прямоугольников вписывается в заданный. Кстати, прямоугольник будет в пикселах.


 
pudel   (2005-06-01 13:51) [43]

Задача: при каком TFont.Height Label.Width/Height равен
Rect.Left/Top/Right/Bottom


 
nikkie ©   (2005-06-01 13:53) [44]

ни при каком


 
Digitman ©   (2005-06-01 14:02) [45]


> pudel   (01.06.05 13:51) [43]


ни при каком

для получения ширины ректа нужно знать ширину "матрицы" фонт-символа

ширина же "матрицы" пропорциональна высоте, но коэф-т пропорц-ти заранее не м.б. известен, т.к. он зависит от конкр.фонта, который к тому же м.б. и TrueType.. для TrueType-фонтов "матрица" есть результат рендеринга векторного представления символа, т.е. пока рендеринг не отработает (всякие Extent-ф-ции и DrawText как раз этим и занимаются явно или неявно), узнать параметры "матрицы" попросту невозможно


 
Digitman ©   (2005-06-01 14:03) [46]

к тому же для TrueType-фонта нужно еще учитывать параметр моноширности


 
-=XP=- ©   (2005-06-01 15:01) [47]

Самое простое решение:

procedure FitText(ACanvas: TCanvas; const ARect: TRect; const AText: string);
var
 BMP: TBitmap;
 TE: TSize;
begin
 BMP := TBitmap.Create;
 try
   BMP.Canvas.Font.Assign(ACanvas.Font);
   BMP.Canvas.Font.Size := 1000;
   BMP.Canvas.Brush.Assign(ACanvas.Brush);
   TE := BMP.Canvas.TextExtent(AText);
   BMP.Width := TE.cx;
   BMP.Height := TE.cy;
   BMP.Canvas.TextOut(0, 0, AText);
   ACanvas.StretchDraw(ARect, BMP);
 finally
   BMP.Free;
 end;
end;


Но оно имеет множество недостатков. Первый - использование промежуточного растра существенно замедляет процесс прорисовки. Второй - нет эффекта Transparent, так как StretchDraw не поддерживает TransparentColor; можно изголяться и дальше, но это приведет к еще большим накладным расходам. Ну и самое главное, третье - так выводить текст - плохой тон. ;)

Наиболее совершенное решение в данном случае - получать совокупность узловых точек полигона, формирующего контур символа и трансформировать символ простым умножением на горизонтальный и вертикальный коэффициенты.

Можно еще повозиться с SetWorldTransform() - он работает с DC, поэтому и на шрифты должен оказывать требуемое воздействие.

Хотя, работа со шрифтами - весьма нелегкая задача - много подводных камней.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.042 c
8-1109600359
wild_arg
2005-02-28 17:19
2005.06.29
Проигрывание mp3


1-1117762854
dp200
2005-06-03 05:40
2005.06.29
FileName


14-1117530340
passlight
2005-05-31 13:05
2005.06.29
Новая Хронология : ваши мнения ?


9-1111398339
reticon
2005-03-21 12:45
2005.06.29
Про DIKeyboard.SetDataFormat


14-1117709898
GolNec
2005-06-02 14:58
2005.06.29
компонент для просмотра Анимированных Gif ok





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский