ID_B equ 111
_bname TCHAR 'Button',0
_bclass TCHAR 'Button',0
_bstyle dd WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON
hMain dd 0
hButt dd 0
invoke CreateWindowEx,0,_class,_title,WS_OVERLAPPEDWINDOW,128,128,256,192,NULL,NULL,0,NULL
mov [hMain],eax
invoke ShowWindow,eax,SW_SHOWNORMAL
invoke CreateWindowEx,0,_bclass,_bname,_bstyle,12,12,25,19,[hMain],ID_B,0,NULL
mov [hButt],eax
invoke ShowWindow,eax,SW_SHOWNORMAL
cmp [hButt],0
jz error
Кнопки средствами API на ассемблере
Проблема заключается в создании кнопки средствами WinAPI на ассемблере.
Так, при задании ID кнопки визникает ошибка ERROR_INVALID_MENU_HANDLE (00000579)
Код:
если же заменить ID_B на ноль, то создается просто два окна, не смотря на класс Button (см. скриншот)
В чем ошибка?
посмотри вот этот пример (там кнопка движется при нажатии на кнопки-стрелки на клавиатуре)
Может это из-за того, что hInstance в CreateWindowEx нули?
Судя по всему, проблема в том, что он пытается создать не дочернее окно и соответственно интерпретирует идентификатор как идентификатор меню. Смотри в сторону стиля окна (4-го параметра). Он должен быть 50000009h в твоем случае.
Цитата:
Код:
_bstyle dd WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON
Вроде дочернее.
Цитата: Somebody
Вроде дочернее.
Судя по изображению - не дочернее. Нужно проверить числовое значение _bstyle, т.к. непонятно откуда берутся константы.
Или написать
Код:
_bstyle dd 50000009h
и проверить.
Цитата:
_bstyle dd 50000009h
Цитата:
_bstyle dd WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON
Решил проблему. При описании переменной, приведенном выше, в строке
Код:
invoke CreateWindowEx,0,_bclass,_bname,_bstyle,12,12,125,125,[hMain],ID_B,0,NULL
Происходит передача функции CreateWindowEx адреса:) переменной _bclass, что совсем не то, чего хотелось бы. Проблему решил, сделав _bclass макросом:
Код:
_bstyle equ WS_CHILD + WS_VISIBLE + BS_PUSHBUTTON+BS_ICON+BS_TEXT
Чтобы передать значение, надо вроде писать в квадратных скобках (как [hMain] в этом коде). Если писать без квадратных скобок, то результат может быть различным (адрес или значение) в зависимости от ассемблера.
Спасибо, я в курсе. Ступил. А в качестве компилятора использую fasm. Постоянно развивается + не Мicro$oft )