Wie erstelle ich ein Dropdown-Menü mit Buttons, welche in einer Toolbar eingebunden sind?



  • Hallo zusammen,

    Ich würde gerne ein DropDown - Menü über Buttons, welche wiederum in einer Toolbar eingebunden sind realisieren. Und zwar immer ein Menü für einen Button.

    Das ganze soll letztendlich so aussehen wie auf dem ersten Bild, nur ohne Pfeil:
    http://www.codeproject.com/KB/menus/ToolBarDropdown.aspx

    Ich arbeite mit Resourcen (*.rc) und habe da die entspechenden Menüeinträge schon fertig. Alles nach bem Schema:

    <MENUNAME> MENU
    BEGIN
        POPUP ""
        BEGIN
                MENUITEM "ITEMNAME01",                      ID_ITEM01
                MENUITEM "ITEMNAME02",                   ID_ITEM02
        END
    END
    

    Die Buttons sind auch schon in der Toolbar.

    Meine Buttons sind vom Style auf TBSTYLE_BUTTON und TBSTYLE_DROPDOWN.
    Den Style TBSTYLE_EX_DRAWDDARROWS will ich nicht nutzen.

    Jetzt meine Fragen.

    1. Wieso kann ich den Button nicht mehr anklicken sobald ich den Style TBSTYLE_DROPDOWN hinzufüge? (Als State übergebe ich nur TBSTATE_ENABLED)
    Fehlt da etwas, oder ist das so nicht machbar?

    2. Wie verlinke ich meine Menüs mit diesen BUTTONS. Wie sieht so ein entsprechender Code - Abschnitt aus? Wie gesagt, hab leider nichts gefunden..
    Ein kleines Beispiel wäre ganz nett. 🙂

    Hier mal so nen kleinen Codeabschnitt, wie die Toolbar und die Buttons erstellt werden bei mir. Erste Funktion erstellt die Toolbar, mittels der zweiten kann ich dann darauf die Buttons realisieren:

    HWND tb_create( HINSTANCE instance, HWND hwnd, HWND hwnd_combo, int style )
    {
        // Initialize common controls.
        INITCOMMONCONTROLSEX icex;
        icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
        icex.dwICC   = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
        InitCommonControlsEx(&icex);
    
        //Create window for toolbar, parent is current window
    
        HWND hwnd_toolbar = CreateWindowEx(  0,
                                        TOOLBARCLASSNAME,
                                        (LPSTR) NULL,
                                        WS_CHILD | style,
                                        0, 0, 0, 0,
                                        hwnd,
                                        (HMENU) 1,
                                        instance,
                                        NULL
                                    );
    
        TBADDBITMAP bitid;
        bitid.hInst = HINST_COMMCTRL;
        bitid.nID = IDB_STD_SMALL_COLOR;
        SendMessage(hwnd_toolbar, TB_ADDBITMAP, 1, (long)&bitid);
    
        SendMessage(hwnd_toolbar, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);       //Backward compatiblity
        SendMessage(hwnd_toolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(90, 78));
        SendMessage(hwnd_toolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(90, 78));
        ShowWindow(hwnd_toolbar, SW_SHOW);                                                  //Show Toolbar!
        return hwnd_toolbar;
    }
    
    void tb_add_button(HWND hwnd_toolbar, int command, char* bitmap_filename, int style = TBSTYLE_BUTTON)
    {
        if (hwnd_toolbar != NULL)       //Continue only if there is a toolbar
        {
            //Bitmap einladen
            HBITMAP h_bitmap;
            h_bitmap = (HBITMAP)LoadImage(  NULL,
                                            bitmap_filename,      // name or identifier of image
                                            IMAGE_BITMAP,          // type of image
                                            90,                      // desired width
                                            78,                      // desired height
                                            LR_LOADFROMFILE          // load flags
                                         );
    
            //fill ADDBITMAP-Structur and overgive Bitmap-Handle
            TBADDBITMAP bitid;
            bitid.hInst = NULL;
            bitid.nID = (UINT)h_bitmap;
    
            TBBUTTON tbbutton;      //Create TBBUTTON-Structur for saving infos about button which is to add
            tbbutton.iBitmap = SendMessage(hwnd_toolbar, TB_ADDBITMAP, 1, (long)&bitid);
            tbbutton.idCommand = command;       //Command-Parameter to Command-Message to recognize clicks on Toolbar-Button
            tbbutton.fsState = TBSTATE_ENABLED;
            tbbutton.fsStyle = style | TBSTYLE_DROPDOWN;
            tbbutton.dwData = 0;
            tbbutton.iString = 0;
    
            //At last, add the button to the Toolbar
            SendMessage(hwnd_toolbar, TB_ADDBUTTONS, (WPARAM) 1, (LPARAM) (LPTBBUTTON) &tbbutton);
        }
    }
    

    Ich arbeite rein mit der WinApi, nutze kein wxWidgets, CToolbar, und so nen Zeugs.. Bräuchte die Lösung auf die klassische Variante.

    Hoffe Ihr könt mir helfen, ich verzweifle schon fast.. 😕 😕


  • Mod

    Sowie ich das sehehast Du TBSTYLE_EX_DRAWDDARROWS nicht gesetzt.

    Lies doch einfach mal die MSDN und den entsprechenden Abschnitt inkl. Samples:
    How to Handle Drop-down Buttons
    http://msdn.microsoft.com/en-us/library/hh298395(VS.85).aspx



  • Diesen Style will ich ja auch nicht setzen da ich diesen Pfeil nicht haben will. geht das ganze auch ohne diesen Style?

    Wie sehe denn ein kleiner Codeabschnitt aus der ein Menü öffnet wenn ich den Button drücke, das würde mir denke ich mal auch schon reichen, dann würde ich es rein über TBSTYLE_BUTTON lösen..



  • Und warum willst du den Pfeil nicht? Der Benutzer wird sich ziemlich wundern, wenn er auf eine vermeintliche Schaltfläche klickt und dann aber ein Menü aufgeht. Warum also gegen die vom Benutzer gewohnte Funktionalität umbiegen?


  • Mod

    Dann mach doch einen normalen Button. Behandle den WM_COMMAND und zeige ein Menü mit TrackPopopMenu an der entsprechenden Stelle an.


Anmelden zum Antworten