Split Button in Toolbar Resize



  • Hallo zusammen,

    ich arbeite derzeit daran, die momentan in unserem Programm verwendete CMenuBar Stück für Stück abzutragen und sie letztlich zu ersetzen. Hierzu habe ich eine CToolBar genutzt, auf der Split Buttons abgelegt werden sollen. Beim Klick auf den Button selbst soll eine von mir festgelegte Aktion erfolgen, beim Klick auf den Pfeil ein Popup mit den bisherigen Submenus erscheinen.

    Soweit habe ich das auch schon umgesetzt. Nun soll aber diese Toolbar weiter in Richtung Touchscreen optimiert werden. Die Buttongröße selbst anzupassen ist ja noch einfach machbar, allerdings passt sich die Breite des Pfeilbereichs leider nicht an und ich bräuchte Tipps, ob und wie das machbar ist, dass der Bereich des Split Buttons mit dem Pfeil evtl. sogar die gleiche Breite hat, wie der restliche Button. Zwar fürchte ich, dass ich vermutlich alles selbst zeichnen muss (und davon habe ich keine Ahnung, also selbst gezeichnete Controls auf CToolBar), aber ich habe die Hoffnung noch nicht aufgegeben, dass es vielleicht doch einen einfachen Kniff gibt, wie so etwas zu realisieren ist.

    Über jede Hilfe und jeden Hinweis bin ich dankbar 😉

    Grüße



  • Schau mal den event.
    NM_GETCUSTOMSPLITRECT

    in Map zum Beispiel

    ON_NOTIFY(NM_GETCUSTOMSPLITRECT, IDC_SPLIT1, &CTESTBUTTONDlg::OnNMGetCustomSplitRectSplit1)

    und zum Beispiel die Funktion:

    void CTESTBUTTONDlg::OnNMGetCustomSplitRectSplit1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    NMCUSTOMSPLITRECTINFO *info = reinterpret_cast<NMCUSTOMSPLITRECTINFO *>(pNMHDR);
    info->rcSplit = info->rcClient;
    info->rcSplit.left += info->rcSplit.right /2;
    info->rcButton = info->rcClient;
    info->rcButton.right /= 2;

    *pResult = CDRF_SKIPDEFAULT; // <- Sehr WICHTIG sagt, dass die rechtecke benutzt werden sollen.
    }



  • Das klingt ja schon mal nicht schlecht. Habe ich soweit jetzt eingebaut, allerdings ändert sich gar nichts, beim testweisen Haltepunkt setzen springt er gar nie in die Funktion ein. Kann es sein, dass das nur ab Vista funktioniert, hier auf XP aber nicht? Trotzdem schonmal danke für die Anregung 😉



  • Hallo,

    Der Return muss CDRF_SKIPDEFAULT sein;

    *pResult = CDRF_SKIPDEFAULT;
    

    Möglicheweise an XP läuft es nicht so. Ich habe es mit VC10 unter Vista ausprobiert, es läuft.





  • Hab deine Debug-EXE mal auf XP und auf Win7 laufen lassen. Win7 - ohne Probleme ung eigentlich genau das, was ich will, aber auf XP ist der Button gar nicht sichtbar 😞 Schade.

    Trotzdem danke für deine Mühe und den Sourcecode 😉


Log in to reply