Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кнопки средствами API на ассемблере

602
05 апреля 2008 года
KPI Student
265 / / 16.12.2006
Прошу прощения за тему, которая рассматривалась не один раз, но ни поиск по сайту, ни статьи по Win API проблему не решили.

Проблема заключается в создании кнопки средствами WinAPI на ассемблере.
Так, при задании ID кнопки визникает ошибка ERROR_INVALID_MENU_HANDLE (00000579)
Код:
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


если же заменить ID_B на ноль, то создается просто два окна, не смотря на класс Button (см. скриншот)

В чем ошибка?
261
05 апреля 2008 года
ahilles
1.5K / / 03.11.2005
посмотри вот этот пример (там кнопка движется при нажатии на кнопки-стрелки на клавиатуре)
5.3K
05 апреля 2008 года
Somebody
185 / / 24.12.2006
Может это из-за того, что hInstance в CreateWindowEx нули?
353
05 апреля 2008 года
Nixus
840 / / 04.01.2007
Судя по всему, проблема в том, что он пытается создать не дочернее окно и соответственно интерпретирует идентификатор как идентификатор меню. Смотри в сторону стиля окна (4-го параметра). Он должен быть 50000009h в твоем случае.
5.3K
06 апреля 2008 года
Somebody
185 / / 24.12.2006
Цитата:
 
Код:
_bstyle dd WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON

Вроде дочернее.
353
07 апреля 2008 года
Nixus
840 / / 04.01.2007
Цитата: Somebody
Вроде дочернее.


Судя по изображению - не дочернее. Нужно проверить числовое значение _bstyle, т.к. непонятно откуда берутся константы.
Или написать

 
Код:
_bstyle dd 50000009h

и проверить.
602
17 апреля 2008 года
KPI Student
265 / / 16.12.2006
Цитата:
_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
5.3K
18 апреля 2008 года
Somebody
185 / / 24.12.2006
Чтобы передать значение, надо вроде писать в квадратных скобках (как [hMain] в этом коде). Если писать без квадратных скобок, то результат может быть различным (адрес или значение) в зависимости от ассемблера.
602
18 апреля 2008 года
KPI Student
265 / / 16.12.2006
Спасибо, я в курсе. Ступил. А в качестве компилятора использую fasm. Постоянно развивается + не Мicro$oft )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог