Deaktivierter Bitmap Button (so wie wir ihn kennen...)



  • Hallo!

    Hab eine zunächst einfach scheinende Frage zu Bitmap Buttons: Ihr alle kennt bestimmt deaktivierte Bitmap Buttons: Man erkennt die Form der Grafik noch, nur ist sie grau und in den Button "eingeprägt".

    Nun hab ich mich gefragt, wie das mit der WINAPI zu machen ist, dachte ich doch zuerst, das würde automatisch gemacht, wenn man einen solchen Button zum Beispiel mit EnableWindow(hWindow, false) deaktiviert.

    Geht das auch ohne ownerdrawn buttons?

    Ich kenn die Funktion DrawState() die dafür de facto verantwortlich wäre, nur muss ich dann auch benachrichtigt werden. BN_DISABLED wird zwar gesendet, ist aber laut MSDN veraltet und hat außerdem anscheinend denselben Code wie neuere, ganz andere Notifications!

    Also wenn jemand Vorschläge oder Erfahrungen mit dem Thema hat, bitte helft mir mit diesem Problem. 🙂



  • Ohne Ownerdraw geht das nicht 😉 🙄



  • Naja, ist ja kein Weltuntergang. :p

    Aber wie so oft in der WinAPI Programmierung, hats Microsoft unsereinem ganz schön schwer gemacht:

    Ich frag mich nämlich, wie ich deaktivierte Buttons mit ownerdrawing realisieren kann.

    Ich bin schon froh, dass ich einen normalen, nicht deaktivierten, Bitmap Button zuwege gebracht hab, aber der reagiert teilweise nicht auf einen Klick, wenn man etwas schneller klickt (noch keine Doppelklicks).

    Und wie gesagt, wenn ich ihn inaktiv zeichnen will, wie mach ich das nun?

    Erstens funzt das DrawFramControl() mit dem DFCS_INACTIVE flag nicht, und auch das entsprechende DrawState() bringt nur ein graues Rechteck. Wenn ich beide in jeder nur möglichen Kombination oder jeweils eine davon verwendem wird auch nichts draus.

    Ich denke mal, das liegt daran, dass ich die Bitmap mit BitBlt() per GDI draufmale?

    Achja, falls das wichtig ist: Ich mach alles, was mit diesem Button zu tun hat, ausschließlich während der Behandlung von WM_DRAWITEM (außer natürlich das Erzeugen des Buttons 😉 )

    Wäre schön, wenn jemand eine Antwort hätte. 🙂



  • JensE schrieb:

    Ich denke mal, das liegt daran, dass ich die Bitmap mit BitBlt() per GDI draufmale?

    Das glaube ich auch. Wie wär's mit BM_SETIMAGE?



  • Das geht ja eben auch nicht, denn in der MSDN steht, dass man BS_OWNERDRAW mit keinem anderen Stil vermengen darf, also auch nicht mit BS_BITMAP.

    Hab ich ja auch schon probiert, das Bild wird dann gar nicht erst angezeigt!



  • Dann lagst du mit deinem Gedanken richtig.



  • Du könntest auch einen ToolButton (auf einer ToolBar) benutzen. Ich glaube, da geht das mit dem Disabled-Zustand automatisch.



  • Du könntest auch einen ToolButton (auf einer ToolBar) benutzen.

    Das ist mir irgendwie zu umständlich, denn Toolbars belegen laut MSDN den ganzen Client Bereich eines Parent Window. Also müsste ich irgendwelche unsichtbaren Parents erzeugen, so dass mir nicht für jeden einzelnen Toolbutton die gesamte Breite des Main-Fensters von einer Toolbar belegt wird.

    Wozu ist DrawState() überhaupt da, wenn es nicht funzt?


Anmelden zum Antworten