C# Ungültig machen ist keine paint-Methode aufrufen
Ich habe OnPaint-Methode overrided so zeichnen Sie eine Ellipse auf dem Bildschirm.
protected override void OnPaint(PaintEventArgs e)
{
MessageBox.Show("Paint");
if (debugStarted)
{
int y = rtbLogicCode.PlaceToPoint(new Place(0, debugLine)).Y;
if (rtbLogicCode.GetVisibleState(debugLine).ToString() == "Visible")
{
e.Graphics.FillEllipse(new LinearGradientBrush(new Rectangle(0, y, 15, 15), Color.LightPink, Color.Red, 45), 0, y, 15, 15);
}
base.OnPaint(e);
}
}
private void rtbLogicCode_Scroll(object sender, ScrollEventArgs e)
{
this.Invalidate();
}
Das scroll-Ereignis (Auf das Richtextbox-Steuerelement) ist richtig gehandhabt, aber obwohl ich mich entkräften die form, es ist kein Aufruf der OnPaint-Funktion (Die messagebox nicht angezeigt).
Was könnte die mögliche Ursache dafür?
Edit: ich habe vergessen zu erwähnen, dass auf meine Funktion zur Initialisierung des Kindes bilden (mehr als ein Steuerelement des Hauptformulars mit MDI-Eigenschaft), habe ich die folgenden Stile:
private void LogicCodeInit()
{
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
Edit2: ich habe auch vergessen zu erwähnen, dass das Kind die form wird Hinzugefügt, als eine Kontrolle des TabControl-Steuerelement. Das TabControl dann Hinzugefügt, als ein Steuerelement des Hauptformulars.
this.Invalidate()
genannt wird? Was passiert, wenn Sie erzwingen, dass ein Neuanstrich meine Größenänderung des Fensters?Ich bin sicher, dass invalidate aufgerufen wird (ich habe eine messagebox überprüfen diese auch.) Auch passiert nichts, wenn ich die Größe des Fensters ändern.
InformationsquelleAutor l46kok | 2012-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Call
Update
nachInvalidate
.Invalidate
repaints der form nur, wenn es den Fokus hat, ist es wahrscheinlich nicht immer zu konzentrieren, da es der Hinzugefügt wird alsTabControl
Kind.Vom MSDN-Dokumentation:
Der Schwerpunkt der Sache war, basierend auf Erfahrung, nicht auf die Unterlagen 🙂
Und meine Erfahrung (getestet, jetzt wieder für diese Frage) zeigt
Invalidate
löstOnPaint
unabhängig davon, ob der ungültig-Steuerelement den Fokus hat. Ich bin klicken auf eine Schaltfläche auf form1, ungültig form2.Ich hatte eine andere Erfahrung auf einige andere Projekte. Bedingungen können variieren... aber wie auch immer, Ungültig werden, müssen nicht tatsächlich aktualisieren Sie das Formular. Es nur Hinweise, was aktualisiert werden soll. Wenn es wird nie aktualisiert werden, dann ist das ursprüngliche problem auftreten könnte. Testen, ob
Update
hat in der Tat aktualisieren Sie das Formular sollte zumindest nicht Schaden.Vereinbart, es ist ein einfacher test, der schlimmstenfalls verursachen könnte, Verzögerung oder flackern, aber weder sollte spürbar sein, bedenkt man die doppelte Pufferung.
InformationsquelleAutor Jcl
Aufrufen
Invalidate
auf ein Steuerelement führen wird ungültig, einige oder alle, was anzeigt, dass es aktualisiert werden muss "irgendwann", aber wird nicht dazu führen, das update unverzüglich zu erfolgen. AufrufUpdate
verursachen alle Teile einer Steuerung, die ungültig geworden sind, werden neu gezeichnet sofort. AufrufRefresh
wird eine Kombination der oben genannten Effekte. Wenn das system im Leerlauf ist, wird er rufen Sie die Prozess-updates für Steuerelemente, die alle ungültig Regionen.Den
Invalidate
Methode ist nützlich in Situationen, in denen viele Methoden, das zu ändern, was angezeigt werden soll eine Steuerung ausgeführt werden, in der Reihenfolge. Anstatt neu zu zeichnen, die Kontrolle nach jeder Methode, die geändert, kann man die Methoden, die das Steuerelement ungültig machen diese Teile, die müssen nachzuziehen. Sobald alle Methoden, die möglicherweise ändern Sie die Kontrolle abgeschlossen haben, kann man dann verwendenUpdate
neu zu zeichnen, diejenigen Teile des Steuerelements (falls vorhanden), die ungültig geworden sind. Wenn Neuzeichnen des control nehmen würde, 1/100 Sekunde, und man braucht, um fünfzig Operationen auf, zu vertagen und die Konsolidierung der Aktualisierungen kann machen den Unterschied zwischen einer Steuerung, die scheint, zu aktualisieren augenblicklich, und eine, die dauert eine halbe Sekunde.InformationsquelleAutor supercat
Der Hauptgrund, warum
OnPaint
könnten nicht genannt werden, ist, wenn IhrControlStyle
enthalten nichtUserPaint
. Ich hätte erwartet, dass Sie das erwähnen, wenn Sie haben es, so nehme ich Sie nicht. In diesem Fall, fügen Sie einen AufrufSetStyle
im Konstruktor.Dass sollte genug sein, um
OnPaint
aufgerufen. Nur um sicherzustellen, dass Sie fordern, dass im Konstruktor der gleichen form, derenOnPaint
Sie haben überschrieben, richtig? Und wenn Sie einen Haltepunkt auf den Eintrag IhrerOnPaint
Funktion, die der debugger nie aufhört?BTW, die
GetStyle
Teil meiner Antwort falsch war, jedenfalls habe ich entfernt.Der debugger nie in die OnPaint-Funktion, wenn ich einen breakpoint setzen. Ich weiß nicht, ob das überhaupt eine Rolle spielt, aber wie oben schon gesagt, die OnPaint-Methode überschrieben wird, auf das untergeordnete Fenster, die nicht das Haupt-Fenster (set-als MDIParent). Würde paint-Methode nur aufgerufen werden, auf das Hauptfenster?
Ich habe benutzerdefinierte Zeichnung in untergeordneten MDI-Fenster in Delphi (ich glaube, umschließt die selben winapi-Aufrufe .NET WinForms), so würde ich nicht erwarten, dass es ein problem sein. Ich werde sehen, ob ich kommen kann mit einer einfachen test-Projekt, wenn ich kann.
InformationsquelleAutor