AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

paintbox "fixieren"

Ein Thema von Stephan · begonnen am 1. Nov 2002 · letzter Beitrag vom 2. Nov 2002
Antwort Antwort
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#1

paintbox "fixieren"

  Alt 1. Nov 2002, 20:58
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]
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Alfons_G

Registriert seit: 7. Jun 2002
Ort: München
296 Beiträge
 
Delphi 2007 Architect
 
#2
  Alt 1. Nov 2002, 21:37

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.

Alfons Grünewald



Alfons Grünewald
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#3
  Alt 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
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#5
  Alt 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.
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#7
  Alt 2. Nov 2002, 14:05
Hi,

cool, genauso hab ich mir das vorgestellt!!! Vielen Dank! Hat mir sehr geholfen!!!
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#8
  Alt 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.
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#10
  Alt 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!
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 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