Работа с combobox

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 31 май 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Как работать с Combobox?

    Код (Text):
    1. ComboboxClassName        db "combobox",0
    2.  
    3. invoke CreateWindowEx,
    4. 0,
    5. ADDR ComboboxClassName,
    6. NULL,
    7. WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST,
    8. 70,160,
    9. 250,20,
    10. hwnd,
    11. 0,
    12. hInstance,
    13. NULL
    14. mov  hwndcombobox,eax
    Добавлять в пункты в список. Действие при выборе.
    Может у кого есть "кусок" кода?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    CB_ADDSTRING, CBN_SELCHANGE. Примеры в сорцах на сайте.
     
  3. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Код (Text):
    1. шаблон диалогового окна
    2. IDD_PAGE_1 DIALOG 1, 12, 340, 195
    3. STYLE WS_CHILD |WS_VISIBLE
    4. FONT 10, "Times New Roman"
    5. BEGIN
    6.   CONTROL "",21,"COMBOBOX",CBS_DROPDOWN |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,10,15,95,100
    7.  
    8. данные
    9.  
    10.   hCmbBox          HWND ?
    11.   hDlg                HWND ?
    12.   smpl1              db '800x600x32',0
    13.   smpl6              db '1280x1024x32',0
    14.  
    15. инициализация комбобокса
    16.  
    17.   invoke GetDlgItem,hDlg,21
    18.   mov hCmbBox,eax
    19.   invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1
    20.    ...............
    21.   invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl6
    22.   invoke SendMessage,hCmbBox,CB_SETCURSEL,0,NULL
    проверка
    чтобы получить номер выбранного элемента в списке посылаешь сообщение CB_GETCURSEL
    invoke SendMessage,hCmbBox,CB_GETCURSEL,NULL,NULL
    получаешь индекс
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    при инициализации, чтобы не писать 6 раз
    Код (Text):
    1. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1
    2.    ...............
    3. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl6
    можно чуть подсократить, например так
    Код (Text):
    1. .data
    2. STR1 db 'Красный',0
    3. STR2 db 'Зеленый',0
    4. STR3 db 'Синий',0
    5. STR4 db 'Желтый',0
    6. STR5 db 'Черный',0
    7. STR6 db 'Белый',0
    8. PS DWORD STR1, STR2, STR3, STR4, STR5, STR6
    9.         ....
    10. .code
    11.     ....
    12.     mov edi,offset PS
    13.     mov esi,24
    14. a1:     push [edi+esi-4];PS
    15.         push ebx;0
    16.         push CB_ADDSTRING
    17.         push hCmbBox
    18.         call _imp__SendMessageA@16
    19.         sub esi,4
    20.     jnz a1
     
  5. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Супер.... для начинающего настолько интуитивно.... :)
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    NetDemon
    Раз vg молчит, значит все понятно, но на всякий пожарный, поясняю
    при инициализации combobox, вам придется N раз писать один и тот же код
    Код (Text):
    1. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1
    2.    ...............
    3. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smplN
    где отличие в каждой строке только в адресе строки, которой инициализируется combobox. Этот код можно сократить, если адреса строк заранее занести в массив PS
    Код (Text):
    1. .data
    2. STR1 db 'Красный',0
    3. STR2 db 'Зеленый',0
    4. ...
    5. STRN db 'Белый',0
    6. PS DWORD STR1, STR2, ..., STRN
    тогда можно combobox инициализировать в цикле
    Код (Text):
    1.     mov esi,N*4;счетчик цикла
    2. a1:     push (PS-4)[esi];заполняем каждую строку combobox, пока esi не станет равным 0
    3.         push 0
    4.         push CB_ADDSTRING
    5.         push hCmbBox
    6.         call _imp__SendMessageA@16
    7.         sub esi,4;переходим к следующей строке
    8.         jnz a1;если не конец списка - продолжаем
     
  7. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Mikl__
    Согласен.... мой пример не оптимален.... зато элементарен :)
    И думается мне, что vg молчит совсем по другому поводу ;)
     
  8. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Mikl__
    что мешает вместо
    Код (Text):
    1. push [edi+esi-4]
    2. ...
    3. call SendMessage
    написать
    Код (Text):
    1. invoke SendMessage, ..., [edi+esi-4]
    ? ;)
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    koderr
    offtop
    привычка:)
     
  10. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Молчал потому что был сильно занят. Всем спасибо за ответы, вроде всё понятно, только у меня почему-то не работает :)
    Пишу

    ComboboxClassName db "combobox",0
    string db 'string1',0

    invoke CreateWindowEx,
    0,
    ADDR ComboboxClassName,
    NULL,
    WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST,
    70,160,
    250,20,
    hwnd,
    0,
    hInstance,
    NULL
    mov hwndcombobox,eax
    invoke SendMessage,hwndcombobox,CB_ADDSTRING,NULL,addr string

    string не добовляется. У меня не диалоговое окно, а обычное.
     
  11. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    vg
    ну ты даешь....У тебя твой стринг спрятан в нераскрывшемся списке

    1. увеличь размер комбобокса по вертикали к примеру до 100
    Код (Text):
    1. WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST,
    2. 70,160,
    3. 250,100,
    2. после
    Код (Text):
    1. invoke SendMessage,hwndcombobox,CB_ADDSTRING,NULL,addr string
    добавь
    Код (Text):
    1. invoke SendMessage,hwndcombobox,CB_SETCURSEL,0,NULL