Laden...

[erledigt] Plot verwischt im MDI Child wenn focus() = false

Erstellt von planetberlin vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.132 Views
planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren
[erledigt] Plot verwischt im MDI Child wenn focus() = false

Guten Morgen,
Bin schon seit längerem auf der Suche nach einer passenden Antwort für folgendes Problem:

In einem MDI Parent habe ich z.B. 2 MDI Childs. Wenn ich ein Fenster im MDI Parent verschiebe, verwischen die Fenster, die "unfocused" sind.

Screenshot davon habe ich angehangen.

Hat jemand eine Idee?
Tausend Dank
pb

Hinweis von talla vor 12 Jahren

Bilder immer nur als Dateianhang dem Beitrag hinzufügen. Keine externen Hoster verwenden!

U
58 Beiträge seit 2011
vor 12 Jahren

gibt es performance probleme, wenn du beim verschieben eines fensters die übrigen refreshed? in deinem fall wäre es ja nur eins, das du zusätzlich zu dem, das durch das verschieben ohnehin refreshed wird (?), refreshen müsstest.

EDIT

evtl. ist auch "nur" der inhalt des fensters, das nicht verschoben wird zu refreshen/repainten.

771 Beiträge seit 2009
vor 12 Jahren

Hi planetberlin,

zeichnest du denn die MDI-Childs korrekt (d.h. im Paint-Ereignis, s.a. [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox))?

planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren

@uNki:
Performance Probleme sind aufgrund der Datenmengen zu erwarten.
Wie kann ich denn bei "Verschieben von Child 2" das "Child 1" refreshen?

Das aktive Child selbst refreshe ich so:



private void FormViewer_Move(object sender, EventArgs e)
   {
        this.Invalidate(true);
   }


Wie komme ich an die "unfokussierten" Child-Fenster ran.

@Cat:
MDI wird korrekt gezeichnet. Das DatagridView auf der rechten Seite der Form verwicht nicht. Lediglich das gezeichnete Diagramm links.

Danke für die Hilfe.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo planetberlin,

MDI wird korrekt gezeichnet.

so sieht das aber nicht aus. 😃 Es sieht ein bisschen so aus, als würdest du relativ zur Clipping-Area zeichnen statt relativ zum Form. Schaus dir mal im Debugger an oder logge, welche Zeichenoperationen mit welchen Koordinaten durchgeführt werden. Ich kann mir nicht vorstellen, dass man den Fehler mit normalen Debuggen/Loggen nicht finden kann.

Ob das Fenster den Focus hat, sollte an sich keine Rolle spielen - außer natürlich, dass es nie den Focus haben wird, weil den ja automatisch das andere Fenster hat. Es ist also kein Focus-Problem.

herbivore

U
58 Beiträge seit 2011
vor 12 Jahren

Wie kann ich denn bei "Verschieben von Child 2" das "Child 1" refreshen?

z.b. mit einem event, der dann gefeuert wird, wenn dein ereignis (child 2 wurde verschoben) eintritt.

würde es dann aber nicht während des verschiebens (nicht im Move-Event) refreshen, sondern erst, wenn das fenster verschoben und die maustaste losgelassen wurde. bei jeder mausverschiebung (Move) invalidaten könnte evtl. ruckeln

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo uNki,

das würde aber nichts bringen, wenn der Effekt - wovon ich ausgehe - bei jedem x-beliebigen Fenster auftritt und nicht nur bei Fenstern der eigenen Anwendung. Die Fenster eine anderen Anwendung wären ja nicht so kooperativ, um Bescheid zu sagen.

Anderseits sollte - wenn man das Zeichnen richtig implementiert - überhaupt keine separate Benachrichtigung durch andere Fenster erforderlich sein, weil Windows ja von alleine alle nötigen Bereiche invalidiert.

herbivore

planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren

Vielen Dank für die Hilfen. Ich versuche mal entsprechend darauf ein Feedback zu geben.

  1. Ja, der Effekt tritt bei jedem x-beliebigen Fenster auf und NUR beim Plot.
  2. Das Zeichnen des Plots ist wie folgt implementiert:

Beim Öffnen eines MDI Childs wird das 'Chart_Control' als UserControl mit geladen.

Dann, im geladenen Chart_Control wird via:


public Chart_Control()
        {
            InitializeComponent();

            this.chart = new Chart_Class();
         }

eine Chart Klasse (Chart_Class) instanziiert.

Ein Paint Event des Chart_Controls ruft dann die Paint Methode in der Chart_Class (s.u.).


private void Chart_Control_Paint(object sender, PaintEventArgs e)
        {
            this.chart.Paint(e.Graphics);
            System.GC.Collect();
        }

Ob das richtig so ist, kann ich nicht sagen. Wäre nett wenn das jemand beurteilen könnte.

Zu:

Ich kann mir nicht vorstellen, dass man den Fehler mit normalen Debuggen/Loggen nicht finden kann.

Gibt es zum richtigen Debuggen bzw. Loggen so etwas wie eine Anleitung? Würde dieser Sache mal nachgehen wollen.

Vielen Vielen Dank

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo planetberlin,

Ob das richtig so ist, kann ich nicht sagen.

obwohl es so funktionieren sollte, solltest du statt einer separaten Chart_Class besser eine Unterklasse von ChartControl erstellen und dort OnPaint überschreiben.

BTW: GC.Collect ist unnötig, meistens ist es sogar störend. Lass es weg. Wenn dadurch dei Speicheranzeige im Taskmanager steigt, ist das kein Grund zu Sorge. Den GC sollten wir hier aber nicht weiter vertiefen. Das wurde im Forum oft genug besprochen.

Gibt es zum richtigen Debuggen bzw. Loggen so etwas wie eine Anleitung?

Gibt es bestimmt irgendwo im Netz, aber für das, was ich schon oben sagte, brauchst du eigentlich keine Anleitung, sondern nur ein paar Console/Debug.WriteLine Anweisungen:

... logge, welche Zeichenoperationen mit welchen Koordinaten durchgeführt werden.

herbivore

planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren

Habe mal zum Testen ein kleines OnPaint direkt im Chart_Control überschrieben
(6 Linien s.u.):


protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            
            Pen Pen = new Pen(Color.Black, 1);
            Pen.DashStyle = DashStyle.Solid;

            // Zeichne 6 Linien
            g.DrawLine(Pen, 10, 10, 100, 10);
            g.DrawLine(Pen, 10, 20, 100, 20);
            g.DrawLine(Pen, 10, 30, 100, 30);
            g.DrawLine(Pen, 10, 40, 100, 40);
            g.DrawLine(Pen, 10, 50, 100, 50);
            g.DrawLine(Pen, 10, 60, 100, 60);
        }

Wenn ich nun MDI Childs o.a. Fenster über diese 6 Linien bewege, bleibt alles so wie es soll. Nichts verwischt mehr!!! 😃

... statt einer separaten Chart_Class, ...

Das war der richtige Hinweis!

Danke herbivore!
pb