Создание выпадающего списка (Combobox)
Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.Code (Assembler) : Убрать нумерацию
- ; Идентификатор списка в ресурсах
- 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
- ...
Обработка событий от выпадающего списка выполняется следующим образом:
Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- 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 - первый
- ...
Code (Assembler) : Убрать нумерацию
- ; Развернуть выпадающий список
- invoke SendMessage,[CtrlID],CB_SHOWDROPDOWN,TRUE,0
- ; Восстановить отображение курсора
- invoke SendMessage,[hwnddlg],WM_SETCURSOR, 0, 0
Просмотров: 11996 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(10.02.2011 в 07:57):
Почему нет? Я на гитаре неплохо играю :) А загружать битмапы не обязательно, достаточно их сперва прописать как невидимые, а потом включать по мере надобности.
semiono
(10.02.2011 в 03:50):
Хотел зделать "справочник аккордов" для гитары.
Combobox взял из этого примера, спасибо!
Однако, ещё столько всего понадобилось, что решил бросить затею.
Например, загрузка png-картинок из ресурсов весьма проблематична.
Лишь в masm32 пример был с jpg-форматом, но у масм жуткий синтаксис.
И сам алгоритм загрузки композиции из битмепов 6x5 в окно тоже
суперзадача. Эх жаль нет программистов-гитаристов!
Combobox взял из этого примера, спасибо!
Однако, ещё столько всего понадобилось, что решил бросить затею.
Например, загрузка png-картинок из ресурсов весьма проблематична.
Лишь в masm32 пример был с jpg-форматом, но у масм жуткий синтаксис.
И сам алгоритм загрузки композиции из битмепов 6x5 в окно тоже
суперзадача. Эх жаль нет программистов-гитаристов!
Добавить комментарий
Заполните форму для добавления комментария
Пожалуйста напишите либо по кускам уроки на эту тему.
Либо сразу целиком справочник, но желательно с исходником. :)
Имхо в вебе ничего приличного нет, либо много лишнего и не нужного,
да ещё и платные программы. А я мечтаю простое окно с комбобоксом
и схематичное изображение аккорда (не обязательно струны рисовать)
можно просто как шахматную доску клетками и точками.
Я вообще люблю когда всё аскетично. ))
Кстати, для строя DGDGBD вообще нету в природе справочника.