Windows Programmierung: Toolbar |
#include <commctrl.h> |
Kommt es zu nicht aufgelösten Externals, sollte man prüfen, ob die Library für die Common Controls (comctl32.lib) eingebunden wird.
HWND CreateToolbarEx( HWND hwnd, DWORD styles, UINT wID, int nBitmaps, HINSTANCE hBMInst, UINT wBMID, LPCTBBUTTON lpButtons, int iNumButtons, int dxButton, int dyButton, int dxBitmap, int dyBitmap, UINT uStructSize ); |
Wird als Instanz als Konstante HINST_COMMCTRL verwendet, kann man auf die vordefinierten Buttons des Systems zugreifen wie STD_FILEOPEN oder VIEW_DETAILS. IDB_STD_SMALL_COLOR als Bitmap-ID und
// Definition typedef struct _TBBUTTON { int iBitmap; int idCommand; BYTE fsState; BYTE fsStyle; DWORD dwData; int iString; } TBBUTTON;
// Die Konstante... TBBUTTON tbButtons [] = { {0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {2, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0}, {3, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {4, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, }; |
#define BITMAPCOUNT 4 // Die Konstante... TBBUTTON Buttons [] = { {0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {2, IDM_SAVEAS, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0}, {3, IDM_EXIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, }; HWND CreateToolBar(HWND hWnd, UINT ResID) { return CreateToolbarEx(hWnd, WS_CHILD | WS_VISIBLE, ResID, // des Toolbars BITMAPCOUNT, hInst, IDR_TOOLBAR, Buttons, sizeof(Buttons)/sizeof(TBBUTTON), 16,16,16,16, sizeof(TBBUTTON) ); } |
Auf die WM_CREATE-Nachricht des Hauptfensters wird CreateToolBar aufgerufen. Eine Toolbar-Ressource mit Namen IDR_TOOLBAR wird mit dem Ressource-Editor angelegt. Die Menüeinträge IDM_NEW, IDM_OPEN, IDM_SAVEAS und IDM_EXIT sind damit per Toolbar erreichbar.
Damit die Toolbar nicht von anderen Elementen des Fensters übermalt wird, ist noch die folgende WM_SIZE-Bearbeitung notwendig.
case WM_SIZE: RECT rcl; SendMessage(hToolbar, TB_AUTOSIZE, 0L, 0L); GetWindowRect(hToolbar, &rcl); MoveWindow(hEdit, 0, rcl.bottom - rcl.top, LOWORD(lParam), HIWORD(lParam), TRUE ); break; |
Mit TB_AUTOSIZE wird die Toolbar aufgefordert, ihre optimale Grösse festzulegen. Anschliessend wird eben diese erfragt und vom Clientbereich des Fensters abgezogen.
case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { LPTOOLTIPTEXT lpToolTipText; static char szBuf[80]; case TTN_NEEDTEXT: // tooltip meldet sich und will einen Text lpToolTipText = (LPTOOLTIPTEXT)lParam; LoadString (hInst, lpToolTipText->hdr.idFrom, szBuf, sizeof (szBuf)); lpToolTipText->lpszText = szBuf; break; } break; |
Nun muss lediglich für jede Command-ID unter dieser Nummer auch ein Stringtable in der Ressource angelegt werden.
Man kann ausprobieren, wieviele freie Plätze man braucht. Man kann aber auch eine Nachricht TB_GETITEMRECT an einen Seperator senden und aus dem zurückgegebenen RECT durch (right-left) die Breite ermitteln.
Homepage | (C) Copyright 1999 Arnold Willemer |