Создание выпадающего списка (Combobox)

Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.
; Идентификатор списка в ресурсах 
ID_LIST        = 104
 
; Сегмент данных
section '.data' data readable writeable 
 
; Элементы списка в формате ASCIIZ
items   db 'item 0',0
        db 'item 1',0
        db 'item 2',0
        db 'item 3',0
        db 0           ; Признак окончания списка
 
CtrlID  dd ?           ; Хэндл списка
 
; Сегмент кода
section '.code' code readable executable
        ...
; Процедура обработчика окна
proc DialogProc hwnddlg,msg,wparam,lparam 
        ...
        ; Инициализация окна?
        cmp     [msg], WM_INITDIALOG
        je      wminitdialog 
        ...
wminitdialog:
        ...
        ; Заполнение списка строками
        invoke  GetDlgItem,[hwnddlg],ID_LIST
        mov     [CtrlID],eax
        mov     esi,items    ; Указатель на список элементов
fill_list:
        invoke  lstrlen,esi  ; Длина строки
        or      eax,eax
        jz      fill_end
        push    eax
        ; Добавить строку в список
        invoke  SendMessage, [CtrlID], CB_ADDSTRING, 0, esi
        pop     eax
        add     esi,eax      ; Следующий элемент списка
        inc     esi
        jmp     fill_list
fill_end:
        ; Установить пункт ID=2 дефолтным, нумерация ID начинается с 0
        ; По умолчанию дефолтный первый пункт с ID=0
        invoke  SendMessage, [CtrlID], CB_SETCURSEL, 2, FALSE
        ...
 
; Секция ресурсов
section '.rsrc' resource data readable
        ...
        ; Определение выпадающего списка в ресурсах
        ; 200 - максимальный вертикальный размер раскрываемой области списка,
        ; высота самого элемента расчитывается автоматически и в ресурсах
        ; изменить ее невозможно
        dialogitem 'COMBOBOX', '', ID_LIST, 2, 10, 150, 200,\
        WS_VISIBLE+CBS_DROPDOWNLIST+CBS_HASSTRINGS+WS_VSCROLL
        ...

Более подробное описание флагов и стилей списка читайте на Microsoft Developer Network. Через сообщение CB_ADDSTRING можно в любое время динамически добавлять новые элементы к уже созданному списку, а через CB_SETCURSEL менять текущий выбранный элемент. Это удобно использовать при создании нескольких взаимосвязанных списков. Все добавляемые строки списка должны быть в формате ASCIIZ.

Обработка событий от выпадающего списка выполняется следующим образом:
; Сегмент кода
section '.code' code readable executable
        ...
; Процедура обработчика окна
proc DialogProc hwnddlg,msg,wparam,lparam
        ; Обработка выбора элемента списка
        cmp     [wparam], CBN_SELENDOK shl 16 + ID_LIST
        je      combobox_select
        ...
combobox_select:
        ; Получение активного пункта, CtrlID - хэндл списка
        invoke  SendMessage, [CtrlID], CB_GETCURSEL, 0, 0
        ; На выходе EAX = индекс активного пункта, 0 - первый
        ...

Выбор элемента списка - это наиболее часто употребляемый обработчик. Остальные события, посылаемые списком, описаны там же в MSDN. Исходник с откомпилированным файлом прилагается.
Теги:
Combobox, выпадающий список
Добавлено: 10 Апреля 2018 20:34:44 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...