Warum bekommen meine Controls eine WM_PAINT - Message?
-
Belli schrieb:
ich habe ein Mainwindow (WS_OVERLAPPEDWINDOW), in dem ich zwei Buttons und ein Edit-Control habe.
Wenn ich das Fenster an der Fensterleiste packe und über den Screen ziehe, bleiben die Controls unberührt, sie bekommen keine Messages.
Wenn ich aber das Mainwindow unten rechts an der Ecke packe und die Size ändere, dann bekommen alle meine Controls die Aufforderung, sich neu zu zeichen, obwohl sie von der Größenänderung nicht betroffen sind.
Warum ist das so, bzw. kann ich darauf Einfluß nehmen?Das ist normales Verhalten. Warum sollten die Kindfenster eine Nachricht bekommen, wenn sich nur die Position des Frames verändert? Die Position der Kindfenster ändert sich nicht.
Der gesamte DC Bereich wird gespeichert und mit verschoben. Das spart aus sicht von Windows viel Zeit,weil eben nichts neu gezeichnet werden muss.
-
@Martin: ich glaube ihn stört nicht dass beim Verschieben keine WM_PAINT kommt, sondern ihn stört dass beim Ändern der Grösse eine WM_PAINT an die Controls geht obwohl die nicht im "betroffenen Bereich" liegen.
-
hustbaer schrieb:
@Martin: ich glaube ihn stört nicht dass beim Verschieben keine WM_PAINT kommt, sondern ihn stört dass beim Ändern der Grösse eine WM_PAINT an die Controls geht obwohl die nicht im "betroffenen Bereich" liegen.
Wenn das so ist dann einfach
wndclass.style = CS_HREDRAW | CS_VREDRAW ;in
wndclass.style = 0;ändern
-
@Malermeister:
Das scheint auf den ersten Blick das gewünschte Ergebnis zu bringen! Da ich nun den Style des Mainwindow geändert habe, heißt das nicht, daß eben dieses Mainwindow nun auch keine Nachricht mehr bei Sizeänderungen bekommt?
Denn das könnte doch dann an anderer Stelle zu unerwünschten Effekten führen.
Mir leuchtet einfach nicht ein, wieso ohne diese Änderung diese WM_Paint - Messages an die Child-Fenster gesendet werden, die ja, wie MartinRichter schon festgestellt hat, überflüssig sind.
-
Du solltest das was Martin geschrieben hat nochmal lesen, das was du unterstellst steht da nicht.
Warum die Child-Fenster eine WM_PAINT bekommen? Ganz einfach, weil es sein könnte dass ein Child-Fenster sichtbar wird wenn man die Grösse ändert - und das muss dann natürlich gezeichnet werden, sonst ... sieht man es ja nicht!?!
-
Ich kann mein Mainwindow auf dem Screen hin- und herschieben, ohne daß die Childfenster eine WM_PAINT - Message bekommen.
Wenn ich das Mainwindow so positioniere, daß ein Childfenster zB links 'aus dem Bildschirmbereich heraus' verschoben und deshalb nicht mehr sichtbar ist, DANN bekommt es WM_PAINT - Nachrichten, wenn ich das Mainwindow wieder mehr in den Bildschirmbereich hineinziehe und das Childfenster sichtbar wird.
Offensichtlich erkennt das OS genau, wann das Childfenster neu gemalt werden muß, und wann nicht.
Deshalb wundert es mich, daß das Childfenster WM_PAINT - Messages immer dann bekommt, wenn ich vom Mainwindow die Size ändere, selbst dann, wenn das Childfenster nicht neu gemalt werden müsste, weil es zB in der linken oberen Ecke des Mainwindow positioniert ist, ich aber unten rechts am Mainwindow herumziehe.
Wie gesagt, durch das Setzen des Style = 0 im Mainwindow kann ich dieses Verhalten unterdrücken, kann aber nicht so ganz übersehen, ob das andere, unerwünschte, Effekte nach sich ziehen könnte.
Ich verstehe Deinen Hinweis auf Martin Richter ' s Posting nicht. Er stellt ja letztlich die gleiche Frage: "Warum sollte eine WM_PAINT - Message erzeugt werden, wenn gar nicht neu gezeichnet werden muß?"
-
Bei einer Größenänderung muss Windows bei gesezten CS_HREDRAW | CS_VREDRAW Flags die gesamte Fensterfläche neu zeichnen. Das besagen diese Flags nunmal.
Wenn z.B. die einzelnen Fenster Anhand der Größe neu angepasst werden macht dies auch Sinn.
Wenn Dir das nicht passt, lass diese Flags weg.
-
Martin Richter schrieb:
Bei einer Größenänderung muss Windows bei gesezten CS_HREDRAW | CS_VREDRAW Flags die gesamte Fensterfläche neu zeichnen. Das besagen diese Flags nunmal.
Ja, daß sie das besagen, ist schon klar. Trotzdem darf das ja einen Sinn machen.
Martin Richter schrieb:
Wenn z.B. die einzelnen Fenster Anhand der Größe neu angepasst werden macht dies auch Sinn.
Aber wenn ich die einzelnen Fenster zB via MoveWindow anpasse, werden sie doch sowieso neu gemalt?!
-
Mhm, okay, ich könnte sie bei WM_PAINT natürlich anpassen, OHNE auf das WM_SIZE für das MainWindow explizit zu reagieren ...
Ich denke, damit ist meine Frage beantwortet.
Vielen Dank an alle!
-
Belli schrieb:
Aber wenn ich die einzelnen Fenster zB via MoveWindow anpasse, werden sie doch sowieso neu gemalt?!
Nein! Selbes Problem. Wenn sich nur die Positon ändert nicht.