Für unser Beispiel wollen als untergeordnete Elemente eine
hwndChild := CreateWindowEx(0,'combobox',nil,WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_VSCROLL or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or CBS_AUTOHSCROLL or CBS_DROPDOWN,0,0,100,200,hwndRebar,IDC_COMBOBOX, hInstance,nil);
Wichtig ist nur, wie Sie an der roten Hervorhebung sehen können, dass Sie das Element als Child des Rebar-Controls erzeugen.
Unter einem Band versteht man den Bereich, den ein Control innerhalb der Rebar belegt, etwa:
![]()
Mit dem so genannten "Gripper" (die Hervorhebung auf der linken Seite) lässt sich das Band vergrößern oder verkleinern. Ein Rebar-Control kann mehrere solcher Bänder enthalten. Auf diese Weise kann der Anwender das vorgegebene Aussehen an seine eigenen Wünsche anpassen, usw.
Um nun die Combobox als Band in die Rebar einzufügen, benötigen wir zunächst ihre Abmessungen, da wir die entsprechenden Stilattribute nutzen wollen:
GetWindowRect(hwndChild,rc);
Als nächstes benutzen wir eine
ZeroMemory(@rbbi,sizeof(TRebarBandInfo)); rbbi.cbSize := sizeof(TRebarBandInfo);
In der fMask-Membervariablen geben wir die gewünschten Flags an, die uns interessieren:
rbbi.fMask := RBBIM_SIZE or RBBIM_CHILD or RBBIM_CHILDSIZE or RBBIM_ID or RBBIM_STYLE or RBBIM_TEXT;
| Wert | Bedeutung |
|---|---|
| RBBIM_SIZE | Die cx-Membervariable ist gültig. |
| RBBIM_CHILD | Die hwndChild-Membervariable ist gültig. |
| RBBIM_CHILDSIZE | cxMinChild, cyMinChild, cyChild, cyMaxChild und cyIntegral sind gültig. |
| RBBIM_ID | wId ist gültig. |
| RBBIM_STYLE | Die fStyle-Membervariable ist gültig. |
| RBBIM_TEXT | Die Membervariable lpText ist gültig. |
(weitere Flags finden Sie im MSDN oder PSDK)
Alle diese Flags haben Einfluss auf die Gestaltung des Bandes. Nehmen wir zunächst die Abmessungen, die durch RBBIM_SIZE und RBBIM_CHILDSIZE definiert werden. So wird hier festgelegt, dass die minimalen Abmessungen des Bandes nicht kleiner als die Höhe und Breite der Combobox sein dürfen, die während des Erstellens gültig waren:
rbbi.cxMinChild := rc.Right - rc.Left; rbbi.cyMinChild := rc.Bottom - rc.Top;
Würden Sie beispielsweise den Wert von cxMinChild auf Null setzen, könnte das Band sozusagen bis zum Anschlag verkleinert werden, und das enthaltene Control wäre nicht mehr zu sehen. Doch zurück zum Thema: als Anfangsbreite des Bandes legen wir 100 Pixel fest:
rbbi.cx := 100;
Zu beachten ist, dass die Größe des Bandes aber auch von der Fensterbreite abhängig ist. Es kann also passieren, dass das Band viel breiter ist als Sie hier angeben. Das hängt auch davon ab, ob das nachfolgende Band in einer neuen Zeile begonnen werden soll oder nicht.
Als nächstes wären da die beiden Stilattribute:
rbbi.fStyle := RBBS_CHILDEDGE or RBBS_GRIPPERALWAYS;
| Wert | Bedeutung |
|---|---|
| RBBS_CHILDEDGE | das Band hat am eine Kante am oberen und unteren Rand. |
| RBBS_GRIPPERALWAYS | Der Gripper wird angezeigt, auch wenn nur ein Band im Rebar-Control vorhanden ist. |
| RBBS_BREAK | Das Band wird in einer neuen Zeile begonnen. |
(s. MSDN oder PSDK für weitere Stilattribute)
Gemäß unserer Flag-Auswahl müssen wir dem Band noch eine eindeutige ID und das Handle der Combobox übergeben:
rbbi.wID := IDC_COMBOBOX; rbbi.hwndChild := hwndChild;
Zu guter Letzt geben wir dem Band noch einen Namen, der (dank des Flags RBBIM_TEXT) auch angezeigt wird:
rbbi.lpText := 'ComboBox';
Mit der Nachricht "RB_INSERTBAND" erzeugen wir nun das erste Band, wobei der lparam ein Zeiger auf die TRebarBandInfo-Variable ist. Der wparam enthält den Index, wo das Band eingefügt werden soll. Wird hier der Wert -1 benutzt, wird das neue Band am Ende (hinter dem jeweils letzten Band) angehangen:
SendMessage(hwndRebar,RB_INSERTBAND,WPARAM(-1),LPARAM(@rbbi));
Als Ergänzung wollen wir uns noch ansehen, wie man eine Bitmap als Hintergrund für ein Band nutzen kann. Vorausgesetzt wird, dass sich die gewünschte Bitmap in den Ressourcen des Programms befindet. Wenn dies der Fall ist, werden zunächst die Flags um eine erforderliche Angabe erweitert:
rbbi.fMask := { ... } or RBBIM_BACKGROUND;
Damit können wir die Bitmap laden und an die hbmBack-Membervariable übergeben:
rbbi.hbmBack := LoadBitmap(hInstance,MAKEINTRESOURCE(IDC_BACKBMP));
Rein prinzipiell war es das schon. Wenn Sie allerdings noch Wert auf eine Art "Wasserzeicheneffekt" legen (sprich: das Hintergrundbild soll nicht in irgendeiner Form verändert werden, sobald das Band verkleinert oder vergrößert wird), dann geben Sie am besten noch das Stilattribut RBBS_FIXEDBMP an:
rbbi.fStyle := { .. } or RBBS_FIXEDBMP;
Das war es auch schon.