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

Вниз

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

 
Игорь_Залозных   (2009-01-13 18:04) [0]

Уважаемые господа, как решить, на каком месте, точнее символе, перестала отрисовываться функция DrawText, чтобы
на новом месте выводить остаток строки, начиная с непомещенного символа.
Вот суть:

procedure TForm1.FormPaint(Sender: TObject);
var
r:trect; //1 прямоугольник
vr:trect; //невидимый прямоугольник с расчетом, что текст вместится из 1 прямоугольника полностью
r1:trect; //2 прямоугольник
br:HBRUSH;  //кисть
flag:integer; //флаг выравнивания текста
int:integer; //высота вычисленного текста, вписанного в 1 прямоугольник
y:integer; //высота вычисленного текста, вписанного в vr прямоугольник
dy:integer; // разницы высот между int и y
ay:integer; //высота строки
ax:integer; //длина символа
CountLines:integer; //сколько строк не вошло в 1 прямоугольник
CountLinesInclude:integer; //сколько строк вошло в 1 прямоугольник
s:string; //строка с неизвестной длиной
begin
   s:="1111111111111111111111111111111111111111111111111"+
   "11111111111111111111111111"+
   "222222222222222222222222222222222222"+
   "3333333333333333333333333333333333333"+
   "4444444444444444444444444444444444444"+
   "5555555555555555555555555555555555"+
   "6666666666666666666666666666666666666"+
   "777777777777777777777777777777777777777"+
   "999999999999999999999999999999999999999999999"+
   "55550123456789000111222333444555666777888999" +
   "3333333333333333333333333333333333333333333333333333"+
   "444444444444444444444444444444444444444444444444444444"+
   "example121212other3432424apple2432342hollow"
   ;
     //границы 1 прямоугольника
     r.Left:=30;
     r.Top:=30;
     r.Right:=200;
     r.Bottom:=200;
     br:=CreateSolidBrush(RGB(255,0,0));
     SelectObject(canvas.Handle,br);
     FrameRect(canvas.Handle,r,br);
     //границы 2 прямоугольника
     r1:=r;
     r1.Left:=r.Right+20;
     r1.Right:=r1.Left+(r.Right-r.Left);
     FrameRect(canvas.Handle,r1,br);
     DeleteObject(br);
     flag:=DT_LEFT or DT_WORDBREAK or DT_EDITCONTROL or DT_EXTERNALLEADING;
     SetBkMode(Canvas.Handle,TRANSPARENT);
     ay:=Canvas.TextHeight("W");
     int:=DrawText(Canvas.Handle,Pchar(s),strlen(pchar(s)),r,flag);
     vr:=r;
     vr.Bottom:=1000;
     y:=DrawText(Canvas.Handle,Pchar(s),strlen(pchar(s)),vr,flag or DT_CALCRECT);
     dy:=y-int;
     if ay <= 0 then
     ay:=1;
     CountLines:=round(dy/ay);
     CountLinesInclude:=round((r.Bottom-r.Top)/ay);
     //как узнать, на каком символе функция DrawText перестала
     //рисовать в 1 прямоугольнике, чтобы 2 прямоугольник
     //начал выводить текст, не помещенный в 1 прямоугольник,
     //со следующего символа,
//чтобы во 2 прямоугольнике показался остаток строки.
     //Может, нужна какая-то другая функция?
end;


 
Dimka Maslov ©   (2009-01-13 18:19) [1]

У канваса есть не только функция текстхейдтх и текствидтх. с её помощью данная задача решается элементарным суммированием.


 
{RASkov} ©   (2009-01-13 18:28) [2]

Вот пару функций:
function DivStr(var S: String; R: TRect): String;
var Flags: LongInt;
begin
 Flags:=DT_WORDBREAK or DT_MODIFYSTRING or DT_EDITCONTROL or DT_END_ELLIPSIS;
 InflateRect(R, -4, -4);
 Result:=Copy(S, 1, Length(S));
 DrawTextEx(Form1.Canvas.Handle, PChar(S), -1, R, Flags, nil{@tP});
 S:=StrPas(PChar(S));
 if Length(Result)>=(Length(S)+3) then Delete(Result, 1, Length(S)-3) else Result:="";
end;

function DivStrEx(var S: String; R: TRect; const FNoDraw: Boolean=True): String;
var Flags: LongInt;
begin
 Flags:=DT_MODIFYSTRING or DT_EDITCONTROL or DT_WORD_ELLIPSIS;
 if FNoDraw then Flags:=DT_CALCRECT or Flags;
 InflateRect(R, -4, -4);
 Result:=Copy(S, 1, Length(S));
 DrawText(Form1.Canvas.Handle, PChar(Result), -1, R, Flags);
 Result:=StrPas(PChar(Result));
 while Result[Length(Result)]="." do Delete(Result, Length(Result), 1);
 if Length(S)>=(Length(Result)) then Delete(S, 1, Length(Result)) else S:="";
end;


Если не разберешься, могу полностью модуль кинуть... с формой. Это делалось так же для примера тут кому-то...


 
Игорь_Залозных   (2009-01-13 18:30) [3]

А как же узнавать сколько символов в строке, если у них разная ширина.
Не все так просто, как кажется.
Банальным делением - не получится.
Тем более, мне нужно узнать сколько символов влезло в строку у функции
DrawText.


 
Игорь_Залозных   (2009-01-13 18:31) [4]

RASkov - скинь на ящик - посмотрю.
Спасибо.


 
{RASkov} ©   (2009-01-13 18:42) [5]

> [4] Игорь_Залозных   (13.01.09 18:31)

Хорошо, позже только смогу выслать.


 
Игорь_Залозных   (2009-01-13 19:13) [6]

ширину 1 строки можно узнать так:
DTParams:TDrawTextParams;
lweight:integer;//ширина 1 строки

DTParams.iTabLength := 8;
DTParams.iLeftMargin := 0;
DTParams.iRightMargin := 0;
DTParams.uiLengthDrawn := 0;
DTParams.cbSize:=sizeof(DTParams);
 int:=DrawTextEx(Canvas.Handle,Pchar(s),strlen(pchar(s)),r,flag,@DTParams);
lweight := DTParams.uiLengthDrawn;
Но дальше что делать, пока не знаю.


 
Игорь_Залозных   (2009-01-13 19:13) [7]

То есть, в lweight - количество символов в 1 строке.


 
{RASkov} ©   (2009-01-13 22:32) [8]

Отправил



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
2-1257501455
d@nger
2009-11-06 12:57
2009.12.27
dxDBTreeView и картинки


11-1201519573
Татьяна
2008-01-28 14:26
2009.12.27
Программирование многооконного приложения для WinCE


15-1256595468
Германн
2009-10-27 01:17
2009.12.27
Ищу эксперта.


15-1256434719
Antoxa
2009-10-25 04:38
2009.12.27
Почему сайт "умер"..?


2-1257856549
Kolan
2009-11-10 15:35
2009.12.27
Самодельная отрисовка мигает





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский