Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1257871099
vtur
2009-11-10 19:38
2009.12.27
Создание приложений с использованием DLL


15-1256486186
berlios
2009-10-25 18:56
2009.12.27
Задачка


1-1229944689
dmitry_12_08_73
2008-12-22 14:18
2009.12.27
Получение ссылки на файл после нажатия в проводнике "Копировать"


15-1256309335
YurikGL
2009-10-23 18:48
2009.12.27
Тупо списали с видеокамеры, теперь оно не играет


4-1225560998
POP
2008-11-01 20:36
2009.12.27
Добраться до PortName, через SetupAPI.