![]() |
Paintbox + Scrollbox ?
Hallo,
ich habe immerwieder probleme beim thema scrollen. Da kam mir letzten die idee warum nutze ich nicht irgenwie die scrollbox... also ich habe eine scrollbox z.b. ist sie 640X480 Pixel groß. Meine paintbox ist genauso groß.... die map also das scrollfenster(ich hoffe ihr wist was ich meine) ist z.b. 5 mal so groß wie die eigetnliche scrollbox... kann ich hier irgenwie die scrollbox nutzen ? meine programme wo es nötig wäre nutzen meistens eine objlist:Tobjectlist.... ich hoffe ihr versteht wie ich es meine.. vielen dank für antworten bzw. tipps ! |
Re: Paintbox + Scrollbox ?
Ich verstehe nicht was du meinst.
Ich kann nur sagen, dass ich einem Programm eine TPaintBox auf eine TScrollBox drauf habe. Die TPaintbox kann recht gross werden - deutlich grösser als die Scrollbox. Insgesamt macht dies kein Unterschied - ich muss mich beim Handling der PaintBox um nichts kümmern durch die Scrollbox. D.h. ich muss nichts zurück rechnen, etc, nix. Die Paintbox gibt mir immer die richtigen Koordinaten etc. Vielleicht hilft dir diese Aussage |
Re: Paintbox + Scrollbox ?
du meinst also ich sollte die paintbox genauso groß machen wie die scorllbox bzw. sogra größer...
meine idee war eine andere und zwar: ich habe eine paintbox mit einer festen größe. und eine scrollbox mit einer festen größe. aber das scrollfenster bzw. scrollbereich muss ja irgenwie größer sein damit ich auch wirklich scrollen kann ! |
Re: Paintbox + Scrollbox ?
Die Scrollbox bietet dir nur dann scrollen an, wenn die Elemente in ihr grösser sind als ihr Clientbereich. D.h. du kannst nur dann scrollen, wenn die PaintBox grösser ist. Wozu willst du überhaupt eine Scrollbox einsetzen, wenn deine TPaintBox nicht grösser ist?
Zitat:
|
Re: Paintbox + Scrollbox ?
Hallo,
mir erschließt sich der Sinn eigentlich auch nicht, aber Zitat:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Bevel1.Top := ScrollBox1.Height - Bevel1.Height-16; ScrollBox1.VertScrollBar.Margin := ScrollBox1.Height - Bevel1.Height-16; end; |
Re: Paintbox + Scrollbox ?
Zitat:
Mit der Scrollbox kannst Du dann den Ausschnitt wählen, den Du sehen möchtest. Gruss |
Re: Paintbox + Scrollbox ?
eigentlich habt ihr recht... nur ich zeichne ja auch in einen buffer bevor ich auf die paintbox zeichne
dann müste ich ja beides gleich groß machen ! aufjedenfall muss ich mich dann nicht mehr um die scroll funktion kümmern sehe ich das richtig ? kann ich die scrollbalken denn auch manuell beinflussen ? z.b. wenn die maus am rand ist? z.b. oben, unten, lings, rechts, das ich dann auto. scroll könnte ? |
Re: Paintbox + Scrollbox ?
sagt mal wie macht ihr das eigentlich mit der größe der paintbox?
im moment habe ich aligen auf alClient stehen... passt ihr sie manuel an wenn ich die from size ändere ? |
Re: Paintbox + Scrollbox ?
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:
1 ) or (sel) or (isfocus)) and (typ <> alt_Line) then
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 > - 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:
ich muss inerhalb dieses ereignies ein ereignis aufrufen wo weitere sachen drin stehen !
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; 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 |
Re: Paintbox + Scrollbox ?
Schau welche Objekte oder Zeichenanweisungen in das ClipRect des Canvas der PaintBox fallen (siehe dazu
![]() ![]() Auch ist die Frage: warum zeichnest du ständig neu im MouseMove? Würde es nicht reichen dies nur zu tun, wenn aktiv was verschoben wird? zZ. braucht man in deinem Code z.B. nur Shift gedrück zu lassen beim Mouse Move und schon malt er... Besser wäre hier doch ein InvalidateRect() nur für das gezogene Element mit dem Rechteck seiner Grösse in der alten Position/Ausmaß und danach nochmal in der neuen Position. Dies würde dann schon von Windows ordentlich kombiniert werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz