Работа с combobox

Discussion in 'WASM.BEGINNERS' started by vg, May 31, 2007.

  1. vg

    vg New Member

    Blog Posts:
    0
    Joined:
    Apr 16, 2007
    Messages:
    475
    Как работать с Combobox?

    Code (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

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    CB_ADDSTRING, CBN_SELCHANGE. Примеры в сорцах на сайте.
     
  3. NetDemon

    NetDemon New Member

    Blog Posts:
    0
    Joined:
    Apr 24, 2007
    Messages:
    22
    Code (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

    Blog Posts:
    0
    Joined:
    Nov 14, 2006
    Messages:
    907
    при инициализации, чтобы не писать 6 раз
    Code (Text):
    1. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1
    2.    ...............
    3. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl6
    можно чуть подсократить, например так
    Code (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

    Blog Posts:
    0
    Joined:
    Apr 24, 2007
    Messages:
    22
    Супер.... для начинающего настолько интуитивно.... :)
     
  6. Mikl_

    Mikl_ New Member

    Blog Posts:
    0
    Joined:
    Nov 14, 2006
    Messages:
    907
    NetDemon
    Раз vg молчит, значит все понятно, но на всякий пожарный, поясняю
    при инициализации combobox, вам придется N раз писать один и тот же код
    Code (Text):
    1. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1
    2.    ...............
    3. invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smplN
    где отличие в каждой строке только в адресе строки, которой инициализируется combobox. Этот код можно сократить, если адреса строк заранее занести в массив PS
    Code (Text):
    1. .data
    2. STR1 db 'Красный',0
    3. STR2 db 'Зеленый',0
    4. ...
    5. STRN db 'Белый',0
    6. PS DWORD STR1, STR2, ..., STRN
    тогда можно combobox инициализировать в цикле
    Code (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

    Blog Posts:
    0
    Joined:
    Apr 24, 2007
    Messages:
    22
    Mikl__
    Согласен.... мой пример не оптимален.... зато элементарен :)
    И думается мне, что vg молчит совсем по другому поводу ;)
     
  8. koderr

    koderr New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2006
    Messages:
    205
    Mikl__
    что мешает вместо
    Code (Text):
    1. push [edi+esi-4]
    2. ...
    3. call SendMessage
    написать
    Code (Text):
    1. invoke SendMessage, ..., [edi+esi-4]
    ? ;)
     
  9. Mikl_

    Mikl_ New Member

    Blog Posts:
    0
    Joined:
    Nov 14, 2006
    Messages:
    907
    koderr
    offtop
    привычка:)
     
  10. vg

    vg New Member

    Blog Posts:
    0
    Joined:
    Apr 16, 2007
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Apr 24, 2007
    Messages:
    22
    vg
    ну ты даешь....У тебя твой стринг спрятан в нераскрывшемся списке

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