| Autor |
Beitrag |
c#ler
      
Beiträge: 176
Erhaltene Danke: 1
Win7 64Bit
C#, VBA, VS2013 Ultimate
|
Verfasst: Di 02.08.16 15:05
Hallo Liebe Gemeinde,
folgendes Problem.
Ich habe in meinem Programm verschiedene Winforms-Tabpages.
Auf der 1. Tabpage zeichne ich Lines (Graphics.DrawLine) in ein Panel (Grün/Rot - IO/NIO), sodass damit ein balken gefüllt wird. (50 Lines à 30Px)
Dies geschieht die ganze Zeit über, selbst wenn ich auf eine andere Tabpage wechsle.
Wenn ich allerdings auf die 1. Tabpage zurückkehre, sind alle Lines vor dem Tabpagewechsel nicht mehr sichtbar und es werden nur an einer folgenden Position neue Lines gezeichnet.
Ich vermute es hängt mit dem (OnPaint (Invalidate) bzw. Refresh-Event zusammen.
Wenn ich die Lines im OnPaint-Event zeichne, bleiben diese auch nach dem Tabpagewechsel erhalten, jedoch funktioniert dies aufgrund der Programmlogik nicht (Multithreading & UI-Block)
Hat jemand eine Idee, wie ich mir die bereits gezeichneten Linien auch nach einem Tabpagewechsel erhalten kann?
Graphics.save und dann ein Restore habe ich versucht, funktioniert jedoch leider nicht wie es soll. (Verhalten wie vorher)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 02.08.16 15:30
Zeichnen gehört in den OnPaint Event da kommst du nicht drum herum. Was du machen kannst ist nicht direkt auf das Graphics Object zu zeichnen sondern entweder auf ein Bitmap oder ein BufferesGraphics Instance um dort das gezeichnete zu ~cachen~ und dann in einem Rutsch das Ganze auf das Graphics Object zu zeichen.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 02.08.16 15:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.08.16 12:46
Es nützt nix wenn du das zeichnen via DrawStripes nicht auch in OnPaint aufrufst. Es gibt genug Gelegenheiten wo du neu zeichnen mußt und das einzige Event das dann sicher gefeuert wird wäre onPaint.
Und wenn man eh in OnPaint zeichnen muß gibt es keinen Grund das woanders auch zu machen. Woanders sollte man nur Invalidate/Refresh aufrufen um ein OnPaint auszulösen wenn man Gründe™ hat.
Dein Beispiel würde zum Beispiel die Zeichenfläche nicht zeichnen wenn du das Fenster minimierst/maximierst das Fenster resized es mal kurz ausserhalb des Bildschirm schiebst oder z.B in alten OS'en (ich glaube in XP war es noch so) einfach mal ein anderes Fenster über dieses Fenster schiebst.
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 03.08.16 14:34
Und CreateGraphics sollte man daher auch vermeiden.
PS: Und dein Code hat noch ein paar weitere Unschönheiten (bzw. Fehler):
- p.Dispose() ist falsch (da du ja schon für p1 und p2 dessen Dispose-Methode aufgerufen hast): p ist ja nur eine Referenz, keine Kopie!
- und wenn schon dann using (T t = new T())
Für diesen Beitrag haben gedankt: c#ler
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 03.08.16 16:19
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: c#ler
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.08.16 16:42
| Zitat: | | ... sollte man vermeiden, weil ... ? |
Ich würde primär sagen weil man da wo man zeichnen sollte bereits ein Graphics Object hat. CreateGraphics aufrufen gehört daher für mich in die Code Smell Ecke. Potentiell läuft da was falsch.
Sekundär weil man sich eventuelles DoubleBuffering eines Controls kaput macht und weil an dem Graphics object System Resourcen (GDI Handles) hängen die eher knapp sind.
Für diesen Beitrag haben gedankt: c#ler
|
|
c#ler 
      
Beiträge: 176
Erhaltene Danke: 1
Win7 64Bit
C#, VBA, VS2013 Ultimate
|
Verfasst: Fr 05.08.16 13:02
Ich werde mir das nächste Woche mal näher zu Gemüte führen.
Hatte leider zuletzt wenig Zeit. Vielen Dank für die Antworten bis hierhin. 
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 05.08.16 23:29
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|