Jetzt können wir die Toolbar erzeugen. Damit auch alles funktioniert, müssen wir zuvor noch die Bitmap auswählen und laden. Dazu benutzen wir die Funktion
hBitmap := CreateMappedBitmap(hInstance, 100, 0, nil, 0);
Wenn das erledigt ist, können wir mit
hToolbar := CreateToolbarex(hWnd, WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS or CCS_NODIVIDER or TBSTYLE_FLAT, IDC_TOOLBAR, 3, 0, hBitmap, @tbButtons, length(tbButtons), 0, 0, 16, 15, sizeof(TTBBUTTON));
Im PSDK wird die Funktion "CreateToolbarEx" als veraltet bezeichnet. Stattdessen empfiehlt Ihnen Microsoft die Verwendung von "CreateWindowEx". Das erfordert aber ein paar Zeilen mehr Code. Zuerst erzeugen Sie die Toolbar, wobei Sie Angaben zu Position sowie Höhe und Breite ignorieren können:
hToolBar := CreateWindowEx(0,TOOLBARCLASSNAME,nil,WS_CHILD or WS_VISIBLE or CCS_NODIVIDER or TBSTYLE_TOOLTIPS or TBSTYLE_FLAT {$IFDEF RIGHTTEXT} or TBSTYLE_LIST {$ENDIF}, 0,0,0,0,hWnd,IDC_TOOLBAR,hInstance,nil);
Da die "CreateWindowEx"-Funktion für viele Zwecke benutzt wird, müssen Sie dem neu erstellten Fenster nun auch die Größe des TTBBUTTON-Records übermitteln und dann natürlich auch die Buttons selbst:
SendMessage(hToolBar,TB_BUTTONSTRUCTSIZE,sizeof(TTBBUTTON),0);
SendMessage(hToolBar,TB_ADDBUTTONS,length(tbButtons),LPARAM(@tbButtons));
Und für die Bitmap benötigen Sie nun eine Variable vom Typ TTBAddBitmap, wobei Sie vorher natürlich noch die Bitmap laden müssen:
hBitmap := CreateMappedBitmap(hInstance, 100, 0, nil, 0); aBmp.hInst := 0; aBmp.nID := hBitmap; SendMessage(hToolBar,TB_ADDBITMAP,3,LPARAM(@aBmp));
Wenn Sie eine Farbe der Grafik transparent darstellen wollen, dann benötigen Sie ein Record vom Typ TColorMap. Wenn Sie mehr als eine Farbe ändern wollen, dann sollten Sie ein mehrere TColorMap-Records zu einem Array verbinden.
Das Beispielprogramm enthält eine zweite Bitmapressource, bei der jeder Button einen anders farbigen Hintergrund hat. Diese drei Farben sollen nun durch die typische Hintergrundfarbe für 3D-Objekte ersetzt werden. Auch die Farbe der Beschriftung soll dem System angepasst werden. Dazu benötigen wir, wie schon gesagt, ein Array aus TColorMap-Records:
var cm : array[0..3]of TColorMap;
Jedem Record muss die Farbe zugewiesen werden, die ersetzt werden soll. Und natürlich muss auch die gewünschte neue Farbe angegeben werden. Am Beispiel von Rot würde das so aussehen:
cm[0].cFrom := $000000ff; cm[0].cTo := GetSysColor(COLOR_3DFACE);
Das gleiche machen Sie mit Blau bzw. mit allen Farben, die Sie ersetzen wollen. Dann ändern Sie den o.g. Aufruf von "CreateMappedBitmap" so ab, dass Sie einen Zeiger auf das Array und die Anzahl der zu ersetzenden Farben angeben:
hBitmap := CreateMappedBitmap(hInstance,200,0,@cm[0],length(cm));
Damit werden die Hintergrundfarben (Rot, Blau, Lila) ersetzt, und die Grafik bzw. die Toolbar-Buttons sollten eigentlich vollkommen normal aussehen. Wenn Sie das Beispiel nachvollziehen wollen, dann entfernen Sie in der Demo bitte den Punkt bei diesem Compilerschalter
{.$DEFINE USEMASKBITMAP}
Sie können auch farbintensivere Bilder bzw. Symbole verwenden, die Sie per Imageliste laden. Für das Beispiel greife ich einfach auf die Imageliste des Systems zu und nutze die Symbole von 3 Dateitypen. Die dazu notwendigen Funktionen werden u.a. auch beim Tree-View gezeigt. Aus dem Grund möchte ich hier nur zeigen, wie man die Imageliste an die Toolbar übergibt. Aber zuerst sollen die Buttons optisch etwas aufgepeppt werden:
tbButtons[0].iBitmap := GetIconIndex('.dll'); tbButtons[2].iBitmap := GetIconIndex('.bat'); tbButtons[3].iBitmap := GetIconIndex('.txt');
Die Funktion "GetIconIndex" finden Sie im Beispielprogramm. Sie ermittelt den Symbolindex der drei gezeigten Dateiendungen und sorgt sozusagen dafür, dass die Buttons dann die Symbole dieser drei Dateitypen anzeigen.
Wenn die Imageliste geladen und bereit ist, dann kann sie mit der Nachricht "TB_SETIMAGELIST" an die Toolbar übergeben werden
SendMessage(hToolbar,TB_SETIMAGELIST,0,hTBImgList);

Damit der Pfeil auf dem dritten Button (Dropdown-Stil) korrekt angezeigt wird, senden wir die Nachricht "TB_SETEXTENDEDSTYLE" mit der Anweisung, den Pfeil zu zeichnen, an die Toolbar:
SendMessage(hToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS);
Wenn Sie Text auf den Buttons anzeigen wollen, benötigen Sie String, der alle Buttonbeschriftungen enthält, die jeweils durch das Zeichen #0 voneinander getrennt sind. Die letzte Beschriftung wird mit zwei #0-Zeichen abgeschlossen:
var TB_Text : string = 'Button 1'#0'Button 2'#0'Button 3'#0#0;
Diesen Text übergeben Sie dann mit Hilfe der Nachricht "TB_ADDSTRING" an die Toolbar. Da es sich hierbei um einen String handelt, ist das erste Zeichen anzugeben:
SendMessage(hToolBar,TB_ADDSTRING,0,LPARAM(@TB_Text[1]));
Alternativ dazu ginge auch "pchar(TB_Text)" bzw. "pointer(TB_Text)". Welcher Button welche Beschriftung besitzt, das entscheiden Sie beim Erzeugen der Buttons mit Hilfe der Membervariablen "iString".
Und damit besitzt unser Programm nun seine Toolbar.
Wenn Sie den Befehl "InitCommonControlsEx" verwenden, müssen Sie für die dwICC-Membervariable die Klasse ICC_BAR_CLASSES benutzen.