# DI_COMBOBOX

Элемент диалога `DI_COMBOBOX` описывает поле ввода со списком (комбинированный список).

    struct FarDialogItem
    {
      enum FARDIALOGITEMTYPES Type = DI_COMBOBOX
      intptr_t X1                  = X1
      intptr_t Y1                  = Y
      intptr_t X2                  = X2
      intptr_t Y2                  = Y (равен значению Y1)
      struct FarList *ListItems    = ListItems
      FARDIALOGITEMFLAGS Flags     = Flags
      const wchar_t *Data          = редактируемый текст
    };

Внимание!

- Приведено схематичное изображение структуры; полное описание структуры см. здесь.

### ListItems

Указатель на структуру FarList, описывающую пункты для начальной инициализации комбинированного списка. Редактируемое поле заполняется значением первого пункта списка с установленным флагом LIF_SELECTED при условии, что `Data` не содержит "редактируемый текст" и есть хотя бы один элемент списка с таким флагом. Если таких пунктов несколько, берётся первый.

Если значение равно `NULL`, то список выводится не будет.

### Флаги

Для элемента `DI_COMBOBOX` имеют значения следующие флаги (про флаги списка см. FarListItem):

Флаг | Описание
--- | ---
DIF_DEFAULTBUTTON | флаг, означающий, что данный элемент диалога является "элементом по умолчанию"
DIF_FOCUS | определяет, что при показе диалога установить клавиатурный фокус ввода на данный элемент
DIF_DROPDOWNLIST | стиль не редактируемого раскрывающегося списка - DropDownList
DIF_EDITEXPAND | "расширять" переменные среды
DIF_EDITPATH | строка ввода будет содержать имена реальных файловых объектов
DIF_LISTAUTOHIGHLIGHT | горячие клавиши будут назначены автоматически
DIF_LISTNOAMPERSAND | показывать горячие клавиши в списке
DIF_LISTWRAPMODE | "заворачивает" список при навигации по списку
DIF_DISABLE | элемент является недоступным
DIF_READONLY | переводит строки редактирования в состояние "только для чтения"
DIF_SELECTONENTRY | выделить редактируемый текст при получении фокуса ввода
DIF_NOFOCUS | управляющий элемент не получает клавиатурный фокус ввода

### События

Событие | Описание
--- | ---
DN_DRAWDLGITEM | начало отрисовки текстовой строки
DN_CTLCOLORDLGITEM | запрос цветовых атрибутов для отрисовки строки редактирования комбинированного списка; `Param2`:
    Colors[0] - редактируемый текст
                    (COL_WARNDIALOGEDIT или COL_DIALOGEDIT)
    Colors[1] - выделенный текст
                    (COL_DIALOGEDITSELECTED)
    Colors[2] - неизмененный текст (UnChanged)
                    (COL_DIALOGEDITUNCHANGED)
    Colors[3] - цвет символа для вызова списка
                    (COL_DIALOGTEXT)

    Param2 (при флаге DIF_DROPDOWNLIST):

    Colors[0] - редактируемый текст
                    (COL_WARNDIALOGEDIT или COL_DIALOGEDIT)
    Colors[1] - выделенный текст
                    (COL_DIALOGEDIT
                элемент в фокусе
                    COL_DIALOGEDITSELECTED)
    Colors[2] - неизмененный текст (UnChanged)
                    (COL_WARNDIALOGEDIT или COL_DIALOGEDIT)
    Colors[3] - цвет символа для вызова списка
                    (COL_DIALOGTEXT)
DN_CTLCOLORDLGLIST | запрос цветовых атрибутов перед отрисовкой открытого комбинированного списка
DN_CONTROLINPUT | нажали клавиатурную клавишу или кликнули клавишей мыши
DN_LISTHOTKEY | пользователь для смены пункта в открытом комбинированном списке воспользовался горячими клавишами
DN_EDITCHANGE | текст изменён
DN_KILLFOCUS | элемент потерял фокус (при условии, что не используется флаг DIF_NOFOCUS)
DN_GOTFOCUS | элемент получил фокус (при условии, что не используется флаг DIF_NOFOCUS)

### Замечания

Работа со списками `DI_COMBOBOX` и `DI_LISTBOX` организована по следующей схеме:

- Запуск DialogInit
  FarDialogItem.Param.ListItems - только для начальной инициализации.
- DM_LISTADD
  Добавляет только пункт списка, без ассоциированных данных
- DM_LISTINSERT
  Вставляет только пункт списка, без ассоциированных данных
- DM_LISTUPDATE
  Удаляет UserData для обновляемого пункта списка.
  Только обновление данных пункта списка без ассоциированных данных
- DM_LISTSETDATA
  Перед установкой новых ассоциированных данных предыдущие уничтожаются (если было выделение по памяти)
- DM_LISTGETDATA
  Возвращается значение, предварительно установленное DM_LISTSETDATA.
- DM_LISTGETDATASIZE
  Возвращается размер ассоциированных данных.
- DM_LISTGETITEM
  Возвращает только пункт списка, без ассоциированных данных.
- Завершение DialogFree
  Ассоциированные данные уничтожаются (если было выделение по памяти)

Смотрите также:
DI_LISTBOX, FarDialogItem