Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi paintbox "fixieren" (https://www.delphipraxis.net/1218-paintbox-fixieren.html)

Stephan 1. Nov 2002 20:58


paintbox "fixieren"
 
Hallo,

das Problem ist folgendes: Ich hab was auf ne paintbox gezeichnet. Sobald ich allerdings ein anderes Fenster oder Form darüberziehe verschwindet die Zeichnung an diesen Stellen.

Wie kann ich sowas verhindern?

viele Grüße

Stephan Munz

[edit=Daniel B]Und ab nach Multimedia[/edit]

Alfons_G 1. Nov 2002 21:37

:hi:
Bei der Paintbox muß sich der Programmierer selbst um das Zeichnen des Inhaltes kümmern.
Bei einem Image erledigt das Windows, weshalb TImage auch entsprechend Resourcen verbrät.

Du musst im Ereignis onPaint, welches die Paintbox immer erhält, sobald sie ganz oder teilweise überdeckt war, das Bild neu zeichnen. Das heisst im Normalfall, dass Du eine Kopie des Bildes im Speicher in einer TBitmap hältst und im onPaint-Ereignis wieder rüber kopierst.

:coder:

Stephan 2. Nov 2002 09:48

Hi,

danke für deine Antwort!
Ich habe eine Variable vom Typ TBitmap erstellt. Aber wie kann ich dieser jetzt das gezeichnete Bild auf der paintbox zuordnen und später wieder zurückkopieren???

viele Grüße

Stephan

Christian Seehase 2. Nov 2002 12:01

Moin Stephan,

ein kleines Beispiel:

Code:
[b]var[/b]
  Form1: TForm1;
  bmpWork : TBitmap;

[b]implementation[/b]

[color=#000080]{$R *.DFM}[/color]

[b]procedure[/b] TForm1.PaintBox1Paint(Sender: TObject);
[b]begin[/b]
  PaintBox1.Canvas.Draw(0,0,bmpWork);
[b]end[/b];

[b]initialization[/b]
[b]begin[/b]
  bmpWork := TBitmap.Create;
  bmpWork.LoadFromFile('c:\nvidia\setup.bmp');
[b]end[/b];

[b]finalization[/b]
[b]begin[/b]
  FreeAndNil(bmpWork);
[b]end[/b];
Ist jetzt nicht ideal, weil es die Grösse der Bitmap/Paintbox nicht berücksichtigt, funktioniert vom Ablauf her aber.

Stephan 2. Nov 2002 13:21

Hi,

aber wie kann ich den Inhalt der auf die paintbox gezeichnet wurde (es ist nicht immer derselbe inhalt) in einem TBitmap speichern. In deinem Beispiel wird es nur aus einer Datei geladen.

Christian Seehase 2. Nov 2002 13:56

Moin Stephan,

wieder ein Beispiel.

Code:
[b]type[/b]
  TForm1 = [b]class[/b](TForm)
    PaintBox1: TPaintBox;
    [b]procedure[/b] PaintBox1Paint(Sender: TObject);
    [b]procedure[/b] FormDestroy(Sender: TObject);
  [b]private[/b]
    [color=#000080]{ Private-Deklarationen }[/color]
    FbmpWork : TBitmap;
    [b]procedure[/b] SavePaintBox;
  [b]public[/b]
    [color=#000080]{ Public-Deklarationen }[/color]
  [b]end[/b];

[b]var[/b]
  Form1: TForm1;

[b]implementation[/b]

[color=#000080]{$R *.DFM}[/color]

[b]procedure[/b] TForm1.SavePaintBox;

[b]var[/b]
  rtWork : TRect;

[b]begin[/b]
  [b]if[/b] Assigned(FbmpWork) [b]then[/b]
  [b]begin[/b]
    FreeAndNil(FbmpWork);
  [b]end[/b];
  FbmpWork       := TBitmap.Create;
  FbmpWork.Width := PaintBox1.Width;
  FbmpWork.Height := PaintBox1.Height;
  rtWork.Left  := 0;
  rtWork.Top   := 0;
  rtWork.Right := FbmpWork.Width;
  rtWork.Bottom := FbmpWork.Height;
  FbmpWork.Canvas.CopyRect(rtWork,PaintBox1.Canvas,PaintBox1.ClientRect);
[b]end[/b];

[b]procedure[/b] TForm1.PaintBox1Paint(Sender: TObject);
[b]begin[/b]
  [b]if[/b] Assigned(FbmpWork) [b]then[/b]
  [b]begin[/b]
    PaintBox1.Canvas.Draw(0,0,FbmpWork);
  [b]end[/b];
[b]end[/b];

[b]procedure[/b] TForm1.FormDestroy(Sender: TObject);
[b]begin[/b]
  [b]if[/b] Assigned(FbmpWork) [b]then[/b]
  [b]begin[/b]
    FreeAndNil(FbmpWork);
  [b]end[/b];
[b]end[/b];
Wenn SavePaintBox aufgerufen wird, wir der Inhalt der Paintbox in eine Bitmap gesichert, und soweit diese etwas enthält, im OnPaint der PaintBox angezeigt.

Stephan 2. Nov 2002 14:05

Hi,

cool, genauso hab ich mir das vorgestellt!!! Vielen Dank! Hat mir sehr geholfen!!!

Stephan 2. Nov 2002 14:07

Hi,

hm, ich hab allerdings einen Nachteil gefunden. Wenn ich ein anderes Form bei savepaintbox über der paintbox gehabt hab wird dieses mit gespeichert.

Christian Seehase 2. Nov 2002 15:24

Moin Stephan,

stimmt.
Du musst halt die richtige Stelle in Deinem Programm finden, an der das Aufgerufen wird, und/oder sicherstellen, dass Dein Programmfenster mit der Paintbox im Vordergrund ist. Dann kann es schliesslich nicht überdeckt sein.

Stephan 2. Nov 2002 15:33

Hi,

genau das ist das Problem. Die Paintbox befindet sich in einer Scrollbox weil sie viel größer ist als der Bildschirm geschweige das Programm. Im Moment hab ichs so gelöst dass falls man in der Scrollbox scrollt wird der komplette Netzwerkplan (mein Programm ist nen Netzwerkmonitor) aus einer Datenbank heraus neu gezeichnet. Problem ist das ganze flimmert kurz auf. Ich weiß auch nciht wie lange das dauert bei mehreren hundert Geräten. Nach jedem neu zeichnen werden die Daten in das TBitmap gezeichnet. In diesem Fall bekommt der Anwender garnicht diesen Fehler zu sehen denn sobald er scrollt oder die Programmgröße verändert wird alles komplett neu gezeichnet. Bewegt er hingegen nur ein Fenster über die paintbox wird das Bild aus dem TBitmap geladen.

Zugegen ist nicht die beste Lösung, im Moment funktioniert allerdings. Obwohl ich schon am überlegen bin ob ich das nicht auf DirectX oder OpenGL umstell. Weil dann könnte ich Sprites verwenden. Denn ich weiß eben nicht wie sich das bei großen Netzwerken verhält.

vielen Dank auf jeden Fall schonmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz