![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перенос строки в canvas'е
zvb © (2005-07-13 09:56:00)работаю с canvas'ом
необходимо вывести некоторую заданную таблицу
сталкнулся с проблемой вывода длинных строк (как сделать перенос строки?)
textout - не подойдет
drawtext из winapi? может, у кого есть пример работы с этой функцией?
zvb (2005-07-15 07:17:00) [1]очень благодарен!
пробую ;)
WondeRu (2005-07-13 13:18:00) [2]isasa © (13.07.05 11:51) [4]
легких путей мы не ищем!!!
вот кусок одного исходника... принцип должен быть понятен
procedure TMultiLineDBGrid.DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Format: Word;
C: array[0..255] of Char;
begin
if LinesPerRow = 1 then
Format := DT_SINGLELINE or DT_LEFT
else
Format := DT_LEFT or DT_WORDBREAK;
Canvas.FillRect(Rect);
StrPCopy(C, Field.AsString);
WinProcs.DrawText(Canvas.Handle, C, StrLen(C), Rect, Format);
end;
isasa (2005-07-13 11:51:00) [3]нет, это никогда не кончится ;)
else begin
prPrev.Canvas.TextOut(x, curLine.Y, copy(buf, 1, hpos-1));
buf:=copy(buf, hpos+1, length(buf));
isasa (2005-07-13 11:46:00) [4]виноват, отвлекли
.................
buf:=fmtLine(repoRect.Right-repoRect.Left, buf);
while length(buf)>0 do begin
hpos:=Pos(#$0A, buf);
if hpos=0 then begin
prPrev.Canvas.TextOut(x, curLine.Y, buf);
buf:='';
end
else begin
prPrev.Canvas.TextOut(x, curLine.Y, buf);
buf:=copy(buf, hpos+1, length(buf));
curLine.Y:=curLine.Y-prPrev.Canvas.Font.Height+interLine;
end;
end;
.................
isasa (2005-07-13 11:42:00) [5]использование
...................
buf:=fmtLine(repoRect.Right-repoRect.Left, buf);
while length(buf)>0 do begin
hpos:=Pos(#$0A, buf);
if hpos=0 then begin
Result:=prPrev.Canvas.TextWidth(buf);
prPrev.Canvas.TextOut(x, curLine.Y, text);
buf:='';
end
else begin
prPrev.Canvas.TextOut(x, curLine.Y, text);
buf:=copy(buf, hpos+1, length(buf));
curLine.Y:=curLine.Y-prPrev.Canvas.Font.Height+interLine;
end;
end;
.................
isasa (2005-07-13 11:37:00) [6]Попробу это
function TrprtForm.fmtLine(Wid: integer; s: string): string;
var lLen, i: integer;
begin
Result:=s;
lLen:=prPrev.Canvas.TextWidth(s);
if lLen<Wid then exit;
i:=length(s)*Wid div lLen;
while not (s[i] in [' ']) do i:=i-1;
Result:=copy(s, 1, i)+#$0A+fmtLine(Wid, copy(s, i+1, length(s)));
end;
prPrev - что-то с объектом Canvas