Форум: "Основная";
Текущий архив: 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