Invalidate( .. )



  • Der Gebrauch der Funktion Invalidate, die OnDraw(.. anstösst, gibt bei mir
    manchmal fehlerhafte Resultate, das heißt mein Schachbrett wird für eine
    Weile falsch gezeichnet.

    ... OnDraw( ... CDC* dDC ..
    {
    ... dDC->Zeichnenfunktion( ...
    }

    allerdings geht folgendes:

    ... MeinInvalidate()
    {
    CClientDC dc(this);
    dc.Zeichnenfunktion( ...
    }



  • Das da oben war nicht so gemeint. Es sollte lauten:
    ...OnDraw(CDC* pDC) ..
    {
    ZeichneFunktion(... pDC ...);
    ...
    }

    und: .. MeinInvalidate()
    {
    CClientDC dc(this);
    ZeichneFunktion ( ...&dc ...);
    ...
    }

    An manchen Stellen, genügt Invalidate(false), an anderen
    muss ich MeinInvalidate() verwenden. ZeichneFunktion zeichnet
    ein Schachbrett, und Invalidate(false) ergibt manchmal ein
    wirres Brett. Genauen Code kann ich hier nicht vorstellen, das
    wäre zu umfangreich. Vielleicht kennt jemand einen ähnlichen Fall.


  • Mod

    Du solltest nur in OnPaint zeichnen. Was willst Du mit MeinInvalidate erreichen?
    In Windows wird ein Fenster nur darüber benachrichtigt, dass ein bestimmter Bereich des Fensters ungültig wird (Invalidate), dann veranlasst Windows eine WM_PAINT Nachricht, die in der MFC auf OnDraw umgesetzt wird.



  • Das Problem, dass ich Invalidate( ... durch MeinInvalidate( ... ersetzen
    musste, trat erst bei meiner neuen Dual Core - Maschine auf. Könnte es sein,
    dass die MFC 6.0 Version bei Dual Core Prozessoren noch Probleme hat. Das
    dürfte eigentlich nicht sein, Die Dual Core Prozessoren haben schon zig, zig,
    Milliarden von Maschinenbefehlen fehlerfrei ausgeführet. Probleme kann es da
    nicht geben. Dann habe ich auch davon gehört, dass die MFC unter Visual
    Studio .NET weiterentwickelt werden. Also könnte dieser ( vermeintliche )
    Fehler behoben werden.


  • Mod

    Es wäre besser Du würdest uns mal erklären wieso es angeblich Probleme mit Dualcore Prozessoren und VC6 gibt.
    Solche Probleme gibt es nicht!

    Es gibt höchstens Programme die schlecht geschrieben sind und nicht mit multithreading umgehen können. 🕶

    Also was ist der wahre Grund für MeinInvalidate?
    Zeig uns Code und wir können Dir evtl. sagen, was Du für Fehler machst.



  • Statt mit OnDraw kann ich auch in OnPaint zeichnen. Nur wie stosse ich
    OnPaint an, um neu zu zeichnen. Weder mit "OnPaint()" noch mit "UpdateWindow()", noch mit "PostMessage(WM_PAINT, 0, 0)" gelingt es. Als ich den OnPaint-Handler anlegte stand als Kommentar: "Kein Aufruf von CView::OnPaint() für
    Zeichnungsnachrichten". Also muss ich doch mit:

    ...MeinNeuZeichnen() ..
    {
    CClientDC dc(this);
    ZeichenFunktion( ... &dc ... );
    ...
    }

    arbeiten. Nichts für ungut.
    Der oben genannte Fehler erscheint auch ohne MultiThreading.
    An einer Stelle kann ich mit Invalidate ... das Neuzeichnen,
    veranlassen an anderer Stelle nicht. Seltsam.



  • GeorgC++ schrieb:

    Statt mit OnDraw kann ich auch in OnPaint zeichnen. Nur wie stosse ich
    OnPaint an, um neu zu zeichnen. Weder mit "OnPaint()" noch mit "UpdateWindow()", noch mit "PostMessage(WM_PAINT, 0, 0)" gelingt es. Als ich den OnPaint-Handler anlegte stand als Kommentar: "Kein Aufruf von CView::OnPaint() für
    Zeichnungsnachrichten".

    Eine Aktualisierung wird mit CWnd::InvalidateRect(LPCRECT lpRect, BOOL bErase = TRUE) erreicht. Mit lpRect kann man den zu aktualisierenden Bereich einschränken. Wenn für lpRect NULL angegeben wird, dann wird das ganze Fenster aktualisiert.


  • Mod

    ... und sofortiges Neuzeichnen erreicht man mit einem UpdateWindow nach dem Invalidate oder der Nutzung von RedrawWindow mit den entsprechenden Flags.

    @GeorgC++: Das sind tiefste Basics der Windows API und MFC Programmierung... Lies noch mal ein Buch zu dem Thema!



  • Vielen, Vielen Dank. Das hat geklappt. Nach Invalidate muss UpdateWindow
    kommen. Auf was für verückte Ideen man doch kommen kann.
    Obwohl ich über 10 dicke Bücher über MFC besitze, habe ich keine Lösung gefunden. Interressant wären Bücher mit solchen Tipps und Tricks.
    Könnt Ihr mir Buchempfehlungen machen ?
    Hoffentlich habe ich Euch nicht zu sehr genervt. Vielen Dank noch mal.


  • Mod

    GeorgC++ schrieb:

    Interressant wären Bücher mit solchen Tipps und Tricks.
    Könnt Ihr mir Buchempfehlungen machen ?

    Das sind keine Tricks. Das sind die Basics, die man lernt wenn man ein Anfänger-Buch das Windows-Programmierung behandelt, von vorne anfängt zu lesen, und es nicht nur als Nachschalgewerk missbraucht. 😉


Anmelden zum Antworten