WM_PAINT wird immer wieder aufgerufen



  • Hi! Ich habe ein Verhalten festgestellt, bei dem ich mir nicht sich bin, ob es korrekt ist.

    Wenn ich WM_PAINT abfange, und 0 zurück gebe, erhalte ich ununterbrocken WM_PAINT-Nachrichten, obwohl es eigentlich keinen Grund gibt:

    case WM_PAINT:
            std::clog << "WM_PAINT" << std::endl;
            return 0;
    

    Wie gesagt, bei dem obigen Beispiel läuft in der Konsole ununterbrocken die Ausgabe immer wieder durch. Ist das gesund?

    Der nachfolgende Code spuckt WM_PAINT nur dann aus, wenn es nötig ist:

    case WM_PAINT:
            std::clog << "WM_PAINT" << std::endl;
            return DefWindowProc(hwnd, msg, wParam, lParam);
    

    Habe ich irgendwo einen Fehler? Hat das was mit der Fensterklasse zu tun? Meine Styleparams:

    dwStyle = WS_OVERLAPPEDWINDOW | WS_TABSTOP | WS_CLIPCHILDREN;
    dwExStyle = WS_EX_APPWINDOW;
    

    Normalerweise sollte doch WM_PAINT nur kommen, wenn wirklich was neu gezeichnet werden muß?!



  • wenn du in wm_paint nur 0 zurückgibst, erkennt Windows den zu aktualisierenden bereich immer noch als ungültig. erst durch einen aufruf von BeginPaint und ein nachfolgendes EndPaint lassen den Bereich wieder gültig werden.



  • Stimmt, hatte nämlich die ganze Zeit ein anderes HWND-Objekt mit BeginPaint() aktualisiert. Man muß also auf jeden Fall das in der Nachricht übergebene HWND mit aktualisieren. Danke!



  • Du musst als aller erstes BeginPaint aufrufen und am Ende EndPaint. Sonst bekommst du von Windows andauernt WM_PAINT Nachrichten, weil es denkt, es müsste noch gezeichnet werden.


Anmelden zum Antworten