2-State Button ?



  • Hallo,

    Ich meine mich errinern zu können, daß es eine Möglichkeit gibt,
    einen Button zu erstellen, der entweder eingedrückt ist oder normal.
    Sprich, daß er einen eingeschalteten oder nicht eingeschalteten Modus
    hat.
    (Einmal klicken -> eingeschaltet)
    (nochmal drauf klicken -> wieder ausgeschaltet)

    Muß ich da SubClassen oder gibt es eine elegantere Methode?

    Gruss,
    Mathias



  • Das ist eine simple CheckBox mit dem Style BS_PUSHLIKE



  • Ich krieg das net gebacken.

    Ich erstelle den Button mit folgendem Code:

    mybut.hwnd=CreateWindow("button",0, BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE, 
    2,2,40,20,hwnd,0,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
    

    Wenn ich jetzt das Prog starte, dann ist da zwar ein Button, der
    verhält sich aber wie ein Standart-Button.
    (Also bleibt nach dem ersten klick nicht eingedrückt...)

    Was mach ich falsch?

    Achja:
    in der WNDPROC hab ich noch kein COMMAND-Befehl ausgearbeitet. Also,
    daß oben ist die einzige Programmzeile, die was mit dem Button zu tun
    hat...

    Kann mir jmd. helfen?
    Gruss,
    Mathias



  • Wenn Du einen PushButton erstellst, brauchst Du Dich nicht wundern, wenn sich der Button dann wie ein PushButton verhält, oder?

    mybut.hwnd=CreateWindow("BUTTON","My CheckButton",  BS_AUTOCHECKBOX|BS_PUSHLIKE|WS_CHILD|WS_VISIBLE, 
    2,2,40,20,hwnd,0,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
    


  • @hepi: Was für einen Wrapper benutzt du?



  • Gar keinen, pure WinAPI, warum?



  • mybut.hwnd

    Deswegen. Was für eine Struktur ist mybut?



  • Das war von meiner Struct, die er übernommen hat.

    ....

    Hab das jetzt auch hingekriegt. Nur wenn ich ich es OwnerDrawn mache,
    kriege ich den "checked" modus nicht hin...
    (Selbst wenn ich mit SendMessage(...BM_SETCHECK...) arbeite)

    Aber wie gesagt, nur wenn ich selber male.
    (mit BM_GETCHECK wird immer eine 0 zurück geliefert)

    Muß ich da noch irgendwas beachten?



  • @WebFritzi:
    Hab diese Struktur aus MathiasX seinem Code genommen...

    @MathiasX:
    Warum willst Du die CheckBox OwnerDrawn machen? Was hast Du vor?



  • Ich will einfach nur einen Button, den ich an und ausstellen kann, selber
    malen. "Normale" Button hab ich ja schon in meinem "Layout"... jetzt würd
    ich gern diesen An/Aus-Schalter auch selber malen...
    (Hab jetzt mir ein komplett eigenen Button erstellt. Mich interessiert aber,
    obs auch mit Owner-Draw-Technik funktionieren würde...)



  • MathiasX schrieb:

    Mich interessiert aber, obs auch mit Owner-Draw-Technik funktionieren würde...)

    Funktioniert, das Zeichnen kannst Du z.B. von DrawFrameControl erledigen lassen.

    Aber hattest Du nicht nach einer eleganten Variante gesucht? Was spricht gegen Hepis Vorgehensweise (IMO am Elegantesten)?



  • Also nochmal:
    Wenn ich es, wie von Hepi oben beschrieben, mache, funktioniert ja alles einbandfrei. Da ich aber meine anderen
    "normalen" Buttons in einem anderen Look and Feel habe, wollte ich meine "An/Aus-Schalter" auch gerne so haben.
    Aber sobald ich

    mybut.hwnd=CreateWindow("BUTTON","My CheckButton",  
    [b]BS_OWNERDRAW|[/b]BS_AUTOCHECKBOX|BS_PUSHLIKE|WS_CHILD|WS_VISIBLE, 
    2,2,40,20,hwnd,0,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
    

    benutze, funktioniert das ganze wieder wie ein "normaler" Button.

    Also war meine Folgerung, daß es nicht möglich ist, so einen Toggle-Button
    mit OwnerDraw zu realisieren. Aber da das blöd ist, wollt ich nochmal nachfragen. 😉

    Danke aber für den Link. Werd dem morgen gleich mal nachgehen!



  • Probier doch mal anstatt BS_AUTOCHECKBUTTON lieber BS_CHECKBUTTON

    Dann mußt Du den (glaube ich) eh "selber" zeichnen....

    /Edit:
    Vergiß es, ist Blödsinn, in der MSDN steht:
    Do not combine the BS_OWNERDRAW style with any other button styles.



  • ups... shit. Ist mir vorher gar nicht aufgefallen.
    Dank Dir für den Hinweis!

    Naja, dann ist meine ButtonKlasse wohl doch die beste
    Lösung 🙂

    Danke!



  • @MathiasX: Willst du uns verar5chen? Hepi hat dir gleich in seinem 1. Beitrag gesagt, du sollst den Style BS_PUSHLIKE benutzen. Und dass du BS_AUTOCHECKBOX verwenden sollst, ist auch darin angedeutet worden. Warum zum Teufel tust du es dann nicht? Damit du nicht nochmal fragst:

    const char s[14] = {72,97,108,108,111,32,77,97,116,104,105,97,115};
       CreateWindowA("button", s,
                     WS_CHILD|WS_VISIBLE|BS_PUSHLIKE|BS_AUTOCHECKBOX,
                     0, 0, 150, 23,
                     Handle, NULL, HInstance, NULL);
    


  • Oh man Webfritzi, du bist echt ne Nudel!
    Les' Dir doch mal die Sachen durch, bevor Du hier nen Macker
    machst.
    Aber für Dich nochmal... schön langsam. Gewissermassen zum
    Mitschreiben:
    ICH WOLLTE ES OWNER-DRAWN!

    Verstehst Du das??!?

    Do not combine the BS_OWNERDRAW style with any other button styles.

    Das war dann die Lösung!!
    Und ich danke Hepi für seine sachlichen Antworten! 🙂

    @WebFritzi: Du schaffst es anscheinend immer wieder Dich selbst zum
    Affen zu machen 🤡



  • Da WebFritzi sich offenbar noch rechtfertigen wollte kommt noch das hier dran (stand in einem neuen Thread):

    WebFritzi schrieb:

    So behandlest du also die Leute, die dir helfen wollen? Bevor ich gepostet hatte, hatte ich die neuen Beiträge noch nicht gesehen. Und dass du es OWNERDRAWN willst, hattest du vorher nicht gesagt. Du wolltest einen An- und Ausschalt-Button. Den hast du von Hepi bekommen. Hast darauf aber nicht ordentlich reagiert. Wer sich hier zum Affen gemacht hat, das bist DU. Und wenn du den Button OWNERDRAWN willst, dann musst du halt alles komplett selber malen.



  • Nicht ich bin zu erst unfreundlich geworden, sondern Du.
    Aber ist das hier so Sitte?
    (Ich mein, daß man unfreundlich Fragen beantworten darf, aber
    wehe der Fragende deutet an, daß es doch auch freundlicher geht...)

    Aber wenn dem so ist... Entschuldige ich mich.
    Ich wollte dir net aufn Schlips treten. Nur du darfst vor lauter
    Hilfsbereitschaft nicht ein gewisses Maß an Freundlichkeit vergessen 😉



  • Da hast du wohl recht. Aber weißt du, es gibt genug Leute hier, die Ratschläge von anderen einfach ignorieren und weiter ihren eigenen Weg verfolgen. Das ärgert mich, verstehst du? Du hättest wenigstens was zu BS_PUSHLIKE und BS_AUTOCHECKBOX sagen können, damit wir wissen, was du wirklich willst. Warum willst du das eigentlich OWNERDRAW machen? Sieht doch so ganz gut aus, oder findest du nicht?

    @flenders: Danke.



  • Weil ich so ne Toolbar wie bei Photoshop mache. Und die sieht nochmal
    besser aus, als die Standart-Buttons 😉


Anmelden zum Antworten