Thema: Delphi Paintbox + Scrollbox ?

Einzelnen Beitrag anzeigen

mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Paintbox + Scrollbox ?

  Alt 16. Jan 2007, 17:10
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
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat