Eine ComboBoxEx erzeugen


Eine ComboBoxEx ist eine erweiterte Form der ComboBox, die eine eingebaute Unterstützung für Grafiken besitzt. Allerdings ist der Stil CBS_OWNERDRAWVARIABLE nicht möglich, weil die Unterstützung in Form von Imagelisten realisiert wurde. Das bedeutet, Sie können mehrere Grafiken in diese Liste laden und müssen sich nicht selbst um das Zeichnen der Bilder kümmern. Allerdings haben diese Grafiken dann immer die selbe Größe. Ansonsten verhält sich die ComboBoxEx wie eine normale ComboBox.

Allerdings handelt es sich hier um ein so genanntes "Common Control". Es ist daher sehr wichtig, dass die ComboBoxEx zwingend mit "InitCommonControlsEx" initialisiert werden muss, sonst sehen Sie sie erst gar nicht

var
  iccex : TInitCommonControlsEx =
    (dwSize:sizeof(iccex);
     dwICC:ICC_USEREX_CLASSES;);
begin
  InitCommonControlsEx(iccex);
{ ... } end.

Sie sehen sie auch nicht, wenn Sie nur "InitCommonControls" aufrufen, wie Sie das evtl. bei einigen anderen "Common Controls" noch sehen werden.


Das Control erzeugen

Wenn Sie die "Common Controls" und damit die ComboBoxEx initialisiert haben, dann können Sie sie wie jedes andere Control erzeugen, wobei als Klassenname WC_COMBOBOXEX zu benutzen ist:

hCBEx := CreateWindowEx(0,WC_COMBOBOXEX,nil,WS_BORDER or WS_CHILD or
  WS_VISIBLE or CBS_DROPDOWN,10,10,300,150,wnd,IDC_CBEX,hInstance,nil);



Erweiterte Stilattribute

WertBedeutung
CBES_EX_CASESENSITIVE Die Suche nach Text in der ComboBoxEx ist abhängig von der Schreibweise der Strings.
CBES_EX_NOEDITIMAGE Das Eingabefeld und die Liste der ComboBoxEx zeigen keine Grafiken an
CBES_EX_NOEDITIMAGEINDENT Das Eingabefeld und die Liste der ComboBoxEx zeigen keine Grafiken an

(weitere Stile finden Sie im PSDK)

Wenn Sie einen der erweiterten Stile setzen wollen, dann benötigen Sie die Nachricht "CBEM_SETEXTENDEDSTYLE", wobei Sie den wParam auf Null setzen sollten. Das bewirkt, dass alle Flags, die Sie im lParam angeben, berücksichtigt werden. bspw.

SendMessage(hCBEx,CBEM_SETEXTENDEDSTYLE,0,CBES_EX_NOEDITIMAGEINDENT);

Im Gegensatz dazu wäre im folgenden Aufruf das Flag CBES_EX_CASESENSITIVE wirkungslos, weil der wParam lediglich CBES_EX_NOEDITIMAGE enthält und damit das zweite Flag im lParam ignoriert

SendMessage(hCBEx,
  CBEM_SETEXTENDEDSTYLE,
  CBES_EX_NOEDITIMAGE,
  CBES_EX_NOEDITIMAGE or CBES_EX_CASESENSITIVE);