Autor |
Beitrag |
MeierZwoo
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Di 23.04.13 01:56
Delphi 2007, Win7 32bit
Guten Morgen,
ich zeichne in eine TPaintBox des Hauptformulars eine Grafik (TBitMap). Wenn das Programm läuft (oder auch im Run-Mode) und ein anderes Programm (egal welches, Explorer, Notpad ...) legt sich über mein Programm-Fenster, wird von meiner Grafik alles unter dem anderen Fenster gelöscht - mit Bewegen dieses anderen Fensters kann ich die gesamte Grafik "ausradieren".
Welche Einstellungen der TPaintBox oder des TBitMap oder der TForm sind da falsch oder nicht gesetzt?
Die TPaintBox ist in der TForm declariert,
die TBitMap in TForm public declariert und wird beim Erzeugen der Form created.
Dazu noch die Frage: Es gibt in der Tool-Palette zwar TImage, aber kein TBitMap. Oder finde ich dies nur nicht.
Danke :) Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Di 23.04.2013 um 09:34
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.04.13 07:15
Dann zeichnest du fälschlicherweise nicht im OnPaint der PaintBox.
www.michael-puff.de/...ffScreenBitmap.shtml
Für diesen Beitrag haben gedankt: MeierZwoo
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 23.04.13 08:24
Und TImage ist eine Komponente zur Darstellung verschiedener Grafikformate, TBitmap hingegen eine Klasse zur Verwaltung des Formats Bitmap.
Für diesen Beitrag haben gedankt: MeierZwoo
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Di 23.04.13 10:10
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.04.13 10:44
MeierZwoo hat folgendes geschrieben : | Warum das OnPaint Ereignis aufgerufen wird aber richtigerweise noch nichts "tut", ist mir allerdings noch ein Rätsel. Mit Repaint führt es alles aus, aber teils auch ohne Repaint. |
OnPaint wird aufgerufen, wenn Windows dem Control Bescheid gibt (mit der Botschaft WM_PAINT), dass es neugezeichnet werden muss. Das passiert z.B. automatisch, wenn das Fenster neu erstellt wird.
Mit Repaint sagst du unabhängig davon Bescheid, dass der Inhalt neu gezeichnet werden muss und Windows löst dann auch brav das Neuzeichnen aus. 
|
|
IhopeonlyReader
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 23.04.13 13:27
ich denke du erstellst erst ein "Bild" und lässt dies dann zeichnen oder? (mit Canvas.Draw(0,0 gezeichnetesBild) )
zeichne nun einfach nicht in die paintbox sondern auf ein Bitmap (aktuelles bild), und schreibe ins onpaint der paintbox
PaintboxX.Canvas.Draw(0,0, aktuellesBild)
dadurch verhinderst du1. das Zeichnungen direkt gesehen werden (render Problem), ebenfalls flackert es dadruch nicht so...
2. ist kann man es dann einfach wieder übermalen...
stell dir vor:
du machst ein Foto (bild Zeichnung) und du willst was umstellen, was aber wenn der Fotoapparat noch ein Foto macht, während du umstellst? deshalb mache das so, dass du wenn du fertig umgestellt hast sozusagen ein Foto machst, und die ganze zeit dieses Foto anzeigst, bis du wieder fertig gezeichnet hast...
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Di 23.04.13 13:31
jaenicke, Mißverständnis:
Mit "nichts tut" meinte ich, OnPaint wird aufgerufen, aber es "passiert nichts" (die dort angegeben Grafiken werden nicht gezeichnet).
Ich lasse ein Protokoll mitschreiben, damit ich es etwas kontrollieren/verstehen kann: Dort sieht man den Einsprung in OnPaint (z.B. beim Programmstart, ...), aber der Bildschirm bleibt leer (soll er auch zu diesem Zeitpunkt).
Nun habe ich das Zuweisen der Handle (TBitMap.HandleAllocated) mit protokollieren lassen, und damit ist es klar: Wenn den in OnPaint zu zeichnenden BitMaps noch kein Handle zugewiesen wurde (z.B. bei CreateForm), kann und soll auch nichts "passieren". Mir war nur nicht klar, daß OnPaint das Handle abfragt - ich hatte mit einem Fehler gerechnet, wenn die BitMaps noch nicht initialisiert ist.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| (Protokoll) FormCreate --------> RsPaintBox.RsOnPaint Handles: TempBmp FALSE Bmp2 FALSE [1] ... User-Aktion -> procdure zeichnen zeichnen zeichnen: TempBmp geladen zeichnen: TempBmp gesetzt --------> RsPaintBox.RsOnPaint Handles: TempBmp TRUE Bmp2 FALSE [2] zeichnen: Bmp2 geladen zeichnen: Bmp2 gesetzt zeichnen: RsPaintBox.RePaint --------> RsPaintBox.RsOnPaint Handles: TempBmp TRUE Bmp2 TRUE [3] ... FormDestroy |
[1] und [2] sind vom System ausgelöste RsPaintBox.OnPaints,
[3] von "mir" per RePaint ausgelöst.
Ich muß mich auch erst an Handles u.s. gewöhnen. Mir war nur wichtig, zu gewährleisten, daß beim Programmstart noch nichts "passiert", erst nach einer User-Aktion - und das ist nun so OK

|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Di 23.04.13 13:51
IhopeonlyReader, ich zeichne nicht auf/in der/die PaintBox. Ich lasse eine/mehrere BitMaps ausgeben. Das Zauberwort war in der ersten Antwort ganz oben schon gegeben: "OnPaint". Damit war das Problem des Ausradierens gelöst (20 min Tippselei).
Die weitere Diskussion ging nur um mein Verständnis des OnPaint Ereignisses. Vorallem weil OnPaint ja statisch ist - über die gesamte Laufzeit (es sei denn, man ändert die BitMaps, die dort "gezeichnet" werden.

|
|
|