Выпадающий список
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. Исходник с откомпилированным файлом прилагается.