Как работать с Combobox? Код (Text): ComboboxClassName db "combobox",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 Добавлять в пункты в список. Действие при выборе. Может у кого есть "кусок" кода?
Код (Text): шаблон диалогового окна IDD_PAGE_1 DIALOG 1, 12, 340, 195 STYLE WS_CHILD |WS_VISIBLE FONT 10, "Times New Roman" BEGIN CONTROL "",21,"COMBOBOX",CBS_DROPDOWN |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,10,15,95,100 данные hCmbBox HWND ? hDlg HWND ? smpl1 db '800x600x32',0 smpl6 db '1280x1024x32',0 инициализация комбобокса invoke GetDlgItem,hDlg,21 mov hCmbBox,eax invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1 ............... invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl6 invoke SendMessage,hCmbBox,CB_SETCURSEL,0,NULL проверка чтобы получить номер выбранного элемента в списке посылаешь сообщение CB_GETCURSEL invoke SendMessage,hCmbBox,CB_GETCURSEL,NULL,NULL получаешь индекс
при инициализации, чтобы не писать 6 раз Код (Text): invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1 ............... invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl6 можно чуть подсократить, например так Код (Text): .data STR1 db 'Красный',0 STR2 db 'Зеленый',0 STR3 db 'Синий',0 STR4 db 'Желтый',0 STR5 db 'Черный',0 STR6 db 'Белый',0 PS DWORD STR1, STR2, STR3, STR4, STR5, STR6 .... .code .... mov edi,offset PS mov esi,24 a1: push [edi+esi-4];PS push ebx;0 push CB_ADDSTRING push hCmbBox call _imp__SendMessageA@16 sub esi,4 jnz a1
NetDemon Раз vg молчит, значит все понятно, но на всякий пожарный, поясняю при инициализации combobox, вам придется N раз писать один и тот же код Код (Text): invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smpl1 ............... invoke SendMessage,hCmbBox,CB_ADDSTRING,NULL,addr smplN где отличие в каждой строке только в адресе строки, которой инициализируется combobox. Этот код можно сократить, если адреса строк заранее занести в массив PS Код (Text): .data STR1 db 'Красный',0 STR2 db 'Зеленый',0 ... STRN db 'Белый',0 PS DWORD STR1, STR2, ..., STRN тогда можно combobox инициализировать в цикле Код (Text): mov esi,N*4;счетчик цикла a1: push (PS-4)[esi];заполняем каждую строку combobox, пока esi не станет равным 0 push 0 push CB_ADDSTRING push hCmbBox call _imp__SendMessageA@16 sub esi,4;переходим к следующей строке jnz a1;если не конец списка - продолжаем
Mikl__ Согласен.... мой пример не оптимален.... зато элементарен И думается мне, что vg молчит совсем по другому поводу
Mikl__ что мешает вместо Код (Text): push [edi+esi-4] ... call SendMessage написать Код (Text): invoke SendMessage, ..., [edi+esi-4] ?
Молчал потому что был сильно занят. Всем спасибо за ответы, вроде всё понятно, только у меня почему-то не работает Пишу 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 не добовляется. У меня не диалоговое окно, а обычное.
vg ну ты даешь....У тебя твой стринг спрятан в нераскрывшемся списке 1. увеличь размер комбобокса по вертикали к примеру до 100 Код (Text): WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST, 70,160, 250,100, 2. после Код (Text): invoke SendMessage,hwndcombobox,CB_ADDSTRING,NULL,addr string добавь Код (Text): invoke SendMessage,hwndcombobox,CB_SETCURSEL,0,NULL