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.aspxIch 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..
-
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?
-
Dann mach doch einen normalen Button. Behandle den WM_COMMAND und zeige ein Menü mit TrackPopopMenu an der entsprechenden Stelle an.