none
Invalidate aus OnMouseMove löst keine WM_PAINT aus RRS feed

  • Frage

  • Hallo

    ich habe ein kleines Problem was ich nicht verstehe.

    In einer MFC Anwendung in einer von CView abgeleiteten Klasse behandele ich Mausbewegungen in OnMouseMove wo ich Invalidate(TRUE) aufrufe weil die Zeichnroutine in CView was besonderes anzeigen soll (ein Lineal deren Laenge sich mit der Maus bewegt)

    Unter Windows XP führt dieses Invalidate offensichtlich dazu das irgendwann zeitnah eine WM_PAINT Nachricht abgesetzt wird und meine Zeichenroutine losläuft,

    Unter Windows 7 ist dieses Verhalten anders, wenn ich die Maus einen Moment lang nicht bewegt habe und danach wieder bewege wird zwar der Handler OnMouseMove aufgerufen und auch Invalidate(TRUE) aber aus irgend einem Grund wird kein WM_PAINT mehr ausgeloest, erst wenn ich im Maushandler ein PostMessage(WM_PAINT) absetze funktioniert es wieder .

    Warum ist das so ?

    Ist es richtig das Neuzeichnen des Fensters mit PostMessage auszulösen, UpdateWindow führt ja zu einem sofortigen SendMessage von WM_Paint was ich eigentlich nicht brauche ?

    Wäre schoen wenn mir jemand weiterhelfen könnte

    Dienstag, 29. Januar 2013 11:35

Antworten

  • guter Hinweis, ich habe die Desktop composition abgeschaltet aber das Problem bleibt trotzdem unter Windows 7 bestehen.

    Auf das UpdateWindow habe ich verzichtet weil das offenbar einen direkten SendMessage auslöst und was wollte ich verhindern daher hab ich nach dem Invalidate einen PostMessage(WM_PAINT abgeschickt, ich hoffe das macht mir keinen weiteren Stress

    Gibts da irgendwo eine Info oder Doku wie sich das Repaint bzw. WM_PAINT Verhalten zwischen XP und Windows 7 geändert hat (auch wenn das DWM deaktiviert ist) ?

    Das ist ja ne mittlere Katastrophe wenn sich die Anwendung plötzlich anders verhält !

    Mittwoch, 30. Januar 2013 07:06

Alle Antworten

  • Der Grundlegende Unterschied ist zwischen WinXP und Win7 der DWM. Ich habe aus eigener Erfahrung feststellen müsssen, das da so einiges anders läuft als unter Win2000/XP. Ich wage zu behaupten, dass Dein Problem unter Win7 bei inaktiver composition auch nicht auftritt.

    Der DWM hat bei mir leider an so manchen Stellen reingefunkt bei alten Priojekten, die bis WinXP problemlos funktionierten, unter späteren Systemen aber zu fehlenden "Repaints" führte.

    Ich habe um diese Probleme zu lösen eben über UpdateWindow ein neuzeichen erzwungen.

    In einem Projekt hatte ich eine ähnliche Lösung, wo ich auf ein "zeitnahes" WM_PAINT getriggert hatte. Das hat aber unter (damals) Vista nicht funktioniert. Da habe ich dann das erzwingen des Neuzeichnens über einen verzögerten Aufruf von Updatewindow gelöst. Das war unschön, mit der Hand am Arm, war damals aber der "schnelle" ansatz. Später gab es eh ein Redesign, das die updaterei anders gemacht hatte.


    Best regards

    Bordon

    Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar.


    • Bearbeitet Bordon Dienstag, 29. Januar 2013 13:14
    Dienstag, 29. Januar 2013 13:13
  • guter Hinweis, ich habe die Desktop composition abgeschaltet aber das Problem bleibt trotzdem unter Windows 7 bestehen.

    Auf das UpdateWindow habe ich verzichtet weil das offenbar einen direkten SendMessage auslöst und was wollte ich verhindern daher hab ich nach dem Invalidate einen PostMessage(WM_PAINT abgeschickt, ich hoffe das macht mir keinen weiteren Stress

    Gibts da irgendwo eine Info oder Doku wie sich das Repaint bzw. WM_PAINT Verhalten zwischen XP und Windows 7 geändert hat (auch wenn das DWM deaktiviert ist) ?

    Das ist ja ne mittlere Katastrophe wenn sich die Anwendung plötzlich anders verhält !

    Mittwoch, 30. Januar 2013 07:06