Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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

Уважаемые господа, как решить, на каком месте, точнее символе, перестала отрисовываться функция 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;


{RASkov}   (2009-01-13 22:32:00) [1]

Отправил


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

ширину 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:00) [3]

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


{RASkov}   (2009-01-13 18:42:00) [4]

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

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


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

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


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

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


{RASkov}   (2009-01-13 18:28:00) [7]

Вот пару функций:
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;


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


Dimka Maslov   (2009-01-13 18:19:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо