so ich konnte jetzt erfolgreich die scrollbox in mein Paint2 projekt einbauen und es funktniert auch wunderbar... nur habe ich ein problem und zwar beim zeichnen....
ich kann inzwischen (dank eure hilfe) mehre objekte gleichzeitg verschieben oder löschen und ich kann auch die görße ändern von objekten(die objekte sind hierbei kreise, vierecke, linen und soweiter)
das eigentliche problem ist die größe... wenn ich z.b. eine größe von 10000 X 10000 Pixel einstelle stockt es bei diesem code:
Delphi-Quellcode:
procedure TPaint2Main.Paint;
var
r1:TRect;
px1,py1,sx1,sy1,i,sx2,sw,sh:Integer;
begin
inherited Paint;
if liste.AktivDocument.bg <> NIL then begin
liste.AktivDocument.bg.Draw(buffer,false,-1,-1);
liste.AktivDocument.bg.raster.Draw(liste.AktivDocument.bg.position.x,liste.AktivDocument.bg.position.y,liste.AktivDocument.bg.size.x,liste.AktivDocument.bg.size.y,buffer,liste.AktivDocument.bg.oldpen,liste.AktivDocument.bg.oldbrush);
end;
sw:=-1; sh:=-1;
if liste.Documentindex > -1 then begin
with Buffer.Canvas do begin
for i:=0 to liste.AktivDocument.objlist.count-1 do begin
with TPaint2BasesObj(liste.AktivDocument.objlist[i]) do begin
if visible = true then begin
with liste.AktivDocument do begin
// sw:=size.x-(sichtfenster.Right-sichtfenster.left);
if (Sichtfenster.Right > Position.x) and (Sichtfenster.Right-Sichtfenster.left > 0) then begin
sw:=Position.x-((Position.x div (Sichtfenster.Right-Sichtfenster.left)) * buffer.Width);
// Screen.Forms[0].Caption:=IntTostr(Position.x div (Sichtfenster.left) );
sw:=sw div Position.x;
sx2:=sw+(Size.x - position.x)
end
else begin
sw:=position.x;
sx2:=Size.x
end;
Screen.Forms[0].Caption:=intTostr(sw) + '\' + intTostr(Sichtfenster.left) + '\' + intTostr(Sichtfenster.Right);
end;
px1:=sw-5;
py1:=position.y-5;
sx1:=Size.x+5;
sy1:=Size.y+5;
buffer.canvas.Brush.style:=bsSolid;
if (isfocus) or (liste.itemindex = i) then
buffer.canvas.Brush.color:=clBlack
else
if sel then buffer.canvas.Brush.color:=clred;
buffer.canvas.Pen.Style:=psSolid; buffer.canvas.Pen.color:=clYellow;
if ((pointDrawDown > -
1 ) or (sel) or (isfocus)) and (typ <> alt_Line) then
FillRect(px1,py1,sx1,sy1);
// damit der makierungs rahmen gezeichnet wird
// muss geprüft werden ob ein pointDrawMove gesetzt ist
// oder das objekt den focus hat wenn ja dann zeichne
Draw(buffer,(pointDrawDown > -1) or (pointDrawMove > -1) or (isfocus = true),sw,sh);
Raster.Draw(px1+5,py1+5,sx1-5,sy-5,buffer,oldpen,oldbrush);
end;
end; // with TPaint2BasesObj(liste.liste[i])
end; // for
end; // with buffer2.canvas
end; // if Documentenindex
Canvas.Draw(0,0,Buffer);
end; // procedure Paint
[/delphi]
paint2main ist von TCustomControl abgeleitet.... bei jeder mausbeweung wird dies paint durch Invalidate aufgreufen:
Delphi-Quellcode:
procedure TPaint2Main.MouseMove(Shift: TShiftState; X,Y: Integer);
begin
ow:=x;
oh:=y; onMouseMove1(self,Shift,x,y);
if shift <> []
then begin
inherited MouseMove(Shift,X,Y);
Invalidate;
end;
oldpos.x:=x; oldpos.y:=y;
end;
ich muss inerhalb dieses ereignies ein ereignis aufrufen wo weitere sachen drin stehen !
das problem ist jetzt wie gesagt die geschwindigkeit.... ich dachte ich könnte mit copyRect einfach den bereich ständig neuzeichnen der sich ändern aber das gibt leider unerwartet probleme:
1: dazu bräuchte ich ein zweiten buffer in den ich beim klickenden gesammten inhalt vom ersten buffer reinkopieren)
das problem ist hier bei das ändern vom ersten buffer
2: mir fällt einfach keine lösung ein wie ich nur den teilbereich neuzeichnen könnte