none
CFormView und OnEraseBackgound RRS feed

  • Frage

  • Hallo

    ich habe Anwendung unter VS2005 mit einer CFormview in der einige Standardcontrols und ein Ownerdraw ListCtrl verwendet werden.

    Weiterhin verwende ich OnEraseBackground um den Hintergrund der Formview farbig zu zeichnen.

    Es passiert aber, das das Ownerdraw ListCtrl vor der Behandlung von OnErasebackground gezeichnet wird und dann vom OnEraseBackground komplett überdeckt wird. Das verstehe ich aber nicht. Ich dachte immer das OnEraseBackground der Formview zuerst ausgelöst wird und dann die einzelnen Controls in der Formview gezeichnet werden. Das scheint hier aber nicht der Fall zu sein.

    Gibt es dafür eine plausible Erklaerung ?

     

    Donnerstag, 17. Februar 2011 17:55

Antworten

  • Überlappende Controls erhalten jedes selbst ein WM_ERASEBKGND durch WM_PAINT, wenn diese also überlappen, dann kann es hier zu Konflikten kommen, denn ein Control übermalt den Bereich eines anderen.
    Vor allem kann und muss die Reihenfolge nicht die der Z-Order sein in der die Controls gezeichnet werden.
    Vermieden wird dieses Problem durch Verwendung von WS_CLIPSIBLINGS.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 20. Februar 2011 12:27
    Moderator

Alle Antworten

  • > Gibt es dafür eine plausible Erklaerung ?

    Nein! Außer Du hast überlappende Controls in deinem CFormView. Verwende WS_CLIPCHILDREN.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 19. Februar 2011 12:10
    Moderator
  • > Gibt es dafür eine plausible Erklaerung ?

    Nein! Außer Du hast überlappende Controls in deinem CFormView. Verwende WS_CLIPCHILDREN.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

     

    Mit WS_CLIPCHILDREN sieht es im uebrigen deutlich besser aus da nun die Bereich für die Controls beim OnEraseBackground ausgespart bleiben, Danke schon mal fuer den Tip

    Mein Verständnisproblem bleibt aber:

    Was passiert denn bei überlappenden Controls mit OnEraseBackground ?

    Nach wie vor müsste doch OnEraseBackground einmal aufgerufen werden bevor die einzelnen Controls gezeichnet werden bzw. wenn ein Resize der Fromview gemacht wird oder liege ich da falsch.
    Was hat dass mit ueberlappenden Controls zu tun ?

     

    Sonntag, 20. Februar 2011 09:55
  • Überlappende Controls erhalten jedes selbst ein WM_ERASEBKGND durch WM_PAINT, wenn diese also überlappen, dann kann es hier zu Konflikten kommen, denn ein Control übermalt den Bereich eines anderen.
    Vor allem kann und muss die Reihenfolge nicht die der Z-Order sein in der die Controls gezeichnet werden.
    Vermieden wird dieses Problem durch Verwendung von WS_CLIPSIBLINGS.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 20. Februar 2011 12:27
    Moderator