Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.
  1. ; Идентификатор списка в ресурсах 
  2. ID_LIST        = 104
  3.  
  4. ; Сегмент данных
  5. section '.data' data readable writeable 
  6.  
  7. ; Элементы списка в формате ASCIIZ
  8. items   db 'item 0',0
  9.         db 'item 1',0
  10.         db 'item 2',0
  11.         db 'item 3',0
  12.         db 0           ; Признак окончания списка
  13.  
  14. CtrlID  dd ?           ; Хэндл списка
  15.  
  16. ; Сегмент кода
  17. section '.code' code readable executable
  18.         ...
  19. ; Процедура обработчика окна
  20. proc DialogProc hwnddlg,msg,wparam,lparam 
  21.         ...
  22.         ; Инициализация окна?
  23.         cmp     [msg], WM_INITDIALOG
  24.         je      wminitdialog 
  25.         ...
  26. wminitdialog:
  27.         ...
  28.         ; Заполнение списка строками
  29.         invoke  GetDlgItem,[hwnddlg],ID_LIST
  30.         mov     [CtrlID],eax
  31.         mov     esi,items    ; Указатель на список элементов
  32. fill_list:
  33.         invoke  lstrlen,esi  ; Длина строки
  34.         or      eax,eax
  35.         jz      fill_end
  36.         push    eax
  37.         ; Добавить строку в список
  38.         invoke  SendMessage, [CtrlID], CB_ADDSTRING, 0, esi
  39.         pop     eax
  40.         add     esi,eax      ; Следующий элемент списка
  41.         inc     esi
  42.         jmp     fill_list
  43. fill_end:
  44.         ; Установить пункт ID=2 дефолтным, нумерация ID начинается с 0
  45.         ; По умолчанию дефолтный первый пункт с ID=0
  46.         invoke  SendMessage, [CtrlID], CB_SETCURSEL, 2, FALSE
  47.         ...
  48.  
  49. ; Секция ресурсов
  50. section '.rsrc' resource data readable
  51.         ...
  52.         ; Определение выпадающего списка в ресурсах
  53.         ; 200 - максимальный вертикальный размер раскрываемой области списка,
  54.         ; высота самого элемента расчитывается автоматически и в ресурсах
  55.         ; изменить ее невозможно
  56.         dialogitem 'COMBOBOX', '', ID_LIST, 2, 10, 150, 200,\
  57.         WS_VISIBLE+CBS_DROPDOWNLIST+CBS_HASSTRINGS+WS_VSCROLL
  58.         ...
Более подробное описание флагов и стилей списка читайте на Microsoft Developer Network. Через сообщение CB_ADDSTRING можно в любое время динамически добавлять новые элементы к уже созданному списку, а через CB_SETCURSEL менять текущий выбранный элемент. Это удобно использовать при создании нескольких взаимосвязанных списков. Все добавляемые строки списка должны быть в формате ASCIIZ.

Обработка событий от выпадающего списка выполняется следующим образом:
  1. ; Сегмент кода
  2. section '.code' code readable executable
  3.         ...
  4. ; Процедура обработчика окна
  5. proc DialogProc hwnddlg,msg,wparam,lparam
  6.         ; Обработка выбора элемента списка
  7.         cmp     [wparam], CBN_SELENDOK shl 16 + ID_LIST
  8.         je      combobox_select
  9.         ...
  10. combobox_select:
  11.         ; Получение активного пункта, CtrlID - хэндл списка
  12.         invoke  SendMessage, [CtrlID], CB_GETCURSEL, 0, 0
  13.         ; На выходе EAX = индекс активного пункта, 0 - первый
  14.         ...
Выбор элемента списка - это наиболее часто употребляемый обработчик. Остальные события, посылаемые списком, описаны там же в MSDN. Управлять комбобоксом можно при помощи специальных сообщений, например, открыть или закрыть выпадающий список, отправив ему сообщение CB_SHOWDROPDOWN. При этом может возникнуть интересный системный глюк, когда курсор пропадает при наведении на выпадающий список. Лечится это очень просто:
  1.         ; Развернуть выпадающий список
  2.         invoke  SendMessage,[CtrlID],CB_SHOWDROPDOWN,TRUE,0
  3.         ; Восстановить отображение курсора
  4.         invoke  SendMessage,[hwnddlg],WM_SETCURSOR, 0, 0
В приложении пример программы с исходным текстом, которая создает окно с выпадающим списком.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Combobox.Demo.zip (2,566 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 11799 | Комментариев: 3

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
semiono (11.02.2011 в 19:15):
ManHunter, :)
Пожалуйста напишите либо по кускам уроки на эту тему.
Либо сразу целиком справочник, но желательно с исходником. :)
Имхо в вебе ничего приличного нет, либо много лишнего и не нужного,
да ещё и платные программы. А я мечтаю простое окно с комбобоксом
и схематичное изображение аккорда (не обязательно струны рисовать)
можно просто как шахматную доску клетками и точками.
Я вообще люблю когда всё аскетично. ))
Кстати, для строя DGDGBD вообще нету в природе справочника.
ManHunter (10.02.2011 в 07:57):
Почему нет? Я на гитаре неплохо играю :) А загружать битмапы не обязательно, достаточно их сперва прописать как невидимые, а потом включать по мере надобности.
semiono (10.02.2011 в 03:50):
Хотел зделать "справочник аккордов" для гитары.
Combobox взял из этого примера, спасибо!
Однако, ещё столько всего понадобилось, что решил бросить затею.
Например, загрузка png-картинок из ресурсов весьма проблематична.
Лишь в masm32 пример был с jpg-форматом, но у масм жуткий синтаксис.
И сам алгоритм загрузки композиции из битмепов 6x5 в окно тоже
суперзадача. Эх жаль нет программистов-гитаристов!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0043 сек.) / Память: 4.5 Mb
Наверх