2010-02-24 6 views
32

Wenn ich ein Fenster neu zeichnen möchte, gibt es eine bevorzugte Funktion, die zwischen InvalidateRect und RedrawWindow aufruft?Unterschied zwischen InvalidateRect und RedrawWindow

Zum Beispiel werden diese beiden Anrufe gleich: (Sieg wäre ein HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

Die Hauptfrage (n): Wann sollte ich ein verwenden oder das andere? Gibt es Unterschiede im Hintergrund? (verschiedene WM_Messages/focus/order/priorities ..)

Der Grund, dass ich das Fenster neu zeichnen will, ist, weil ich ein neues Bild an es senden, dass ich es anzeigen soll, was bedeutet, dass der Inhalt des Fensters nicht länger ist gültig.

+0

Siehe auch http://stackoverflow.com/questions/7360500/what-are-the-differences-between-redrawwindow-updatewindow-in-win32 – cdiggins

Antwort

46

InvalidateRect wird das Fenster nicht sofort neu gezeichnet. Es "plant" einfach ein zukünftiges Neuzeichnen für einen bestimmten rechteckigen Bereich des Fensters. Mit InvalidateRect können Sie so viele Bereiche planen, wie Sie wollen, so dass sie akkumulieren in einem internen Puffer. Das tatsächliche Neuzeichnen für alle angesammelten geplanten Bereiche wird später stattfinden, wenn das Fenster nichts mehr zu tun hat. (Wenn das Fenster in dem Moment frei ist, in dem Sie den Aufruf InvalidateRect absetzen, wird das Redrawing sofort ausgeführt).

Sie können auch eine sofortige Neuzeichnung für alle derzeit aufgelaufenen ungültigen Bereiche erzwingen, indem Sie UpdateWindow aufrufen. Aber auch wenn Sie es nicht eilig haben, ist das explizite Aufrufen von UpdateWindow nicht notwendig, da sobald das Fenster nicht benutzt wird, es automatisch für alle aktuell ungültigen Bereiche neu gezeichnet wird.

RedrawWindow, auf der anderen Seite ist eine Funktion mit einem viel breiteren und flexiblen Satz von Funktionen. Es kann verwendet werden, um eine Ungültigkeitszeitplanung durchzuführen (d. H. Das gleiche, was InvalidateRect tut), oder es kann verwendet werden, um ein sofortiges erneutes Zeichnen des spezifizierten Bereichs zu erzwingen, ohne irgendeine "Planung" auszuführen. Im letzteren Fall ist das Anrufen RedrawWindow praktisch gleichbedeutend mit dem Aufruf InvalidateRect und dann sofortigen Aufruf UpdateWindow.

1

Ich mag es nicht, nur Links zu geben, aber das MSDN gibt Ihnen alle Informationen, die Sie benötigen, und es wäre eine Verschwendung von Zeit, um alles hier neu zu tippen.

RedrawWindow

InvalidateRect

Kurz gesagt, ja, es gibt Unterschiede. Die Frage ist, warum willst du das Fenster neu zeichnen? Liegt es daran, dass die Inhalte nicht mehr gültig sind? Wenn ja, verwenden Sie InvalidateRect, andernfalls verwenden Sie RedrawWindow.

+0

Ich war auf MSDN und überprüfte die Funktionen, aber die Die Schlussfolgerung, die ich mache, ist, dass sie am Ende ein WM_PAINT an das Fenster senden, indem sie ein Rechteck ungültig machen. Antwort auf Ihre Frage wäre ja, der Inhalt ist ungültig (Es ist ein Bild des Desktops). Ich sende ein Bild in einer konstanten Rate an das Fenster und sende dann ein InvalidateRect an das Fenster, damit es aktualisiert wird - Könnte ich fragen, was ein anderer Grund sein könnte? – Default

+0

Was kann der "andere" Grund sein? –

1

RedrawWindow repaints das Fenster sofort. InvalidateRect markiert nur das Fenster, das bei der nächsten WM_PAINT-Nachricht neu gezeichnet werden soll. WM_PAINT-Nachrichten haben jedoch eine niedrigere Priorität als andere Nachrichten, sodass das Neuzeichnen nicht sofort erfolgt, wenn Ihre App mit der Verarbeitung anderer Nachrichten beschäftigt ist.

+0

Es ist wahrscheinlich erwähnenswert, dass alle "Neuzeichnen" eine 'WM_PAINT'-Nachricht benötigen. Es ist kein Weg um es herum. 'RedrawWindow' sendet auch ein' WM_PAINT' an Ihr Fenster. Der Unterschied ist, dass 'RedrawWindow' es so sendet, dass es sofort verarbeitet wird. – AnT

19

RedrawWindow(win, NULL, NULL, RDW_INVALIDATE); und InvalidateRect(win, NULL, NULL); sind gleichwertig. Beide Funktionen machen das Fenster ungültig. Die WM_PAINT tritt zur normalen Zeit (keine anderen Nachrichten in der Anwendungswarteschlange) in beiden Fällen.

Wenn Sie möchten, dass die Farbe sofort ausgeführt wird, rufen Sie entweder RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW) oder InvalidateRect gefolgt von UpdateWindow auf.

RedrawWindow gibt einfach mehr Optionen mit den RDW_ * Bits. Wenn alles, was Sie wollen, ist das Fenster ohne die sofortige Farbe ungültig machen dann scheint InvalidateRect sauberer zu sein.