![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]У канваса есть не только функция текстхейдтх и текствидтх. с её помощью данная задача решается элементарным суммированием.