Frage zu OnCtlColor()



  • Hallo zusammen,

    ich habe eine grundsätzliche Frage, sobald ich bei einem Fenster OnCtlColor() im Code hizufüge, dann wird diese Funktion aktiv, sobald ein "Steuerelement gezeichnet werden muss". Doch was bedeutet das konkret? Dass beim Öffnen des Fensters alle Steuerelemente gezeichnet werden leuchtet mir ein, aber wann und warum erfolgt das im weiteren Verlauf der Runtime des Dialoges?

    Danke schonmal!



  • zB:
    wenn sich der Inhalt eines Steuerelements ändert
    wenn Deine Anwendung mal ganz oder teilweise von einer anderen verdeckt war





  • @medic89 sagte in Frage zu OnCtlColor():

    aber wann und warum erfolgt das im weiteren Verlauf der Runtime des Dialoges?

    Auf älteren Windows Versionen (z.B. 3.1, 2000, XP), funktioniert die GUI so, dass GUI Elemente per Default einfach nur in den Bildschirm-Speicher gezeichnet werden. D.h. wenn dein Fenster von einem anderen verdeckt wird, dann wird alles überschrieben was für dein Fenster gezeichnet wurde. Wenn dein Fenster nun wieder ganz oder teilweise sichtbar wird, dann muss der Inhalt "rekonstruiert" werden. Dazu schickt Windows dann wieder die entsprechenden Messages an dein Fenster, u.A. WM_PAINT.

    Der Grund das so zu machen war dass Speicher damals eher knapp war. Für jedes Fenster Speicher zu reservieren, damit der gesamte Inhalt bestehen bleibt wenn das Fenster verdeckt wird, war einfach nicht praktikabel.

    Genau so funktioniert es auch wenn du Änderungen an den "Controls" innerhalb deines Fensters machst: es wird erst berechnet welche Bereiche neu gezeichnet werden müssen, und dann bekommt dein Fenster die Aufforderung eben diese Bereiche neu zu zeichnen (-> WM_ERASEBKGND, WM_PAINT etc.).

    Neuere Windows-Versionen verwenden per Default den sog. Desktop Window Manager. Da ist das dann etwas anders - Fensterinhalte müssen da nicht neu gezeichnet werden wenn ein Fenster verdeckt war und wieder sichtbar wird. Am grundlegenden System ändert sich aber nichts. D.h. wenn Controls im Fenster geändert werden bekommt das Fenster weiterhin die Aufforderung die betroffenen Bereiche neu zu zeichnen.

    Vermutlich gibt es auch noch weitere Dinge die dazu führen dass ein Fenster aufgefordert wird seinen Inhalt neu zu zeichnen. Kann dir aber keine vollständige Liste geben.

    Langer Rede kurzer Sinn: dein Programm muss jederzeit in der Lage sein den gesamten Fensterinhalt neu zu zeichnen falls es dazu aufgefordert wird.


Anmelden zum Antworten