Dialog Box+RadASM

Тема в разделе "WASM.BEGINNERS", создана пользователем Eretic, 2 сен 2009.

  1. Eretic

    Eretic New Member

    Публикаций:
    0
    Приветствую всех кто зашёл в темку! Проблема в следующем. Сделал на Си окно с меню. Из элемента меню вызывается модальное окно. Решил повторить в асме. Сделал окно, меню. Нажал Проект->новый->диалог. Чтобы визуально располагать. В описании диалога dia.dlg который находится в Added files написано:
    Код (Text):
    1. #define IDD_DLG1 1000
    2. IDD_DLG1 DIALOGEX 6,6,194,102
    3. CAPTION "IDD_DLG"
    4. FONT 8,"MS Sans Serif",400,0
    5. STYLE 0x10CF0000
    6. EXSTYLE 0x00000000
    7. BEGIN
    8. END
    далее в коде:
    Код (Text):
    1. ...;процедура модального окна пустая. поставил в начале чтобы прототип не делать
    2. AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    3.  
    4.     ret
    5. AboutDlgProc endp
    6. ...
    7. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    8.     LOCAL hInst:HINSTANCE
    9. ... ;проверка на нажатие
    10. invoke DialogBoxParam,hInst,1000,hWnd,AboutDlgProc,0
    вопросы:
    1) можно ли добавлять диалог так как сделал я?
    2) ошибок нет, но окно не появляется. В чём может быть ошибка?
    3) почему DialogBox не воспринимает а DialogBoxParam да?

    Заранее огромное спасибо!
     
  2. InsidE

    InsidE Member

    Публикаций:
    0
    блин...допиши в AboutDlgBox
    Код (Text):
    1. AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    2.  
    3. mov eax,msg
    4.  
    5. cmp eax,WM_INITDIALOG
    6.  jnz @F
    7. xor eax,eax
    8. inc eax
    9. ret
    10. @@:
    11. cmp eax,WM_CLOSE
    12.  jnz @F
    13. invoke EndDialog,hwnd,0
    14. xor eax,eax
    15. inc eax
    16. ret
    17. @@:
    18. xor eax,eax
    19. ret
    20.  
    21. AboutDlgProc endp
     
  3. Eretic

    Eretic New Member

    Публикаций:
    0
    1nsidE
    ничем не помогло. и вообще при чём тут код процедуры? Процедура обрабатывает диалоговое окно. а вызывает это окно DialogBoxParam. Мне как раз и нужно вызвать.
     
  4. InsidE

    InsidE Member

    Публикаций:
    0
    Eretic
    а ты все правильно линкуеш?
    Iczeliоna -а почитай
     
  5. Eretic

    Eretic New Member

    Публикаций:
    0
    1nsidE
    1) читаю ещё как. Может быть ткнёшь какой именно туториал?
    2) линкую в радасме. незнаю как ресурс диалога, но остальные ресурсы нормально прилинковываются
     
  6. InsidE

    InsidE Member

    Публикаций:
    0
    тут. по винапи,10-11 уроки
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Eretic
    Можно. С поправкой на то, что где-то что-то не так делаете.
    Приаттачте архив всего проекта. Чего гадать по звёздам-то?
    Потому что DialogBox - это сишный макрос, а не API-функция.
     
  8. Eretic

    Eretic New Member

    Публикаций:
    0
    Думал сам разберусь но чтото блин не врубаюсь в чём ошибка.
    Код маленький. Плиз кто сможет просмотрите.
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Eretic
    Если процедура диалога ничего не делает, то должен возвратиться FALSE, так что тело процедуры такое:
    Код (Text):
    1. AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    2.     xor eax, eax
    3.     ret
    4. AboutDlgProc endp
    А у тебя - просто:
    Код (Text):
    1. AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    2.     ret
    3. AboutDlgProc endp
    Теперь далее, есть подозрение, что только "xor eax, eax" недостаточно. Такой диалог невозможно будет закрыть, так как нет обработчиков WM_COMMAND на кнопки OK и CANCEL. Даже если таких кнопок нет - эти события всё равно будут посланы диалогу. Например, при нажатии "Close" кнопки [Х] или при нажатии клавиши "Esc".
     
  10. Eretic

    Eretic New Member

    Публикаций:
    0
    Добавил вот так:
    Код (Text):
    1. hwndDlg dd 0
    и вот так вместо моей процедуры и вызова:
    Код (Text):
    1. invoke CreateDialogParam,hInstance,ADDR DlgName,hWnd,OFFSET DlgProc,NULL
    Код (Text):
    1. DlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM
    2.         .if iMsg==WM_INITDIALOG
    3.  
    4.         .elseif iMsg==WM_CLOSE
    5.         invoke EndDialog,hWnd,NULL
    6.         mov hwndDlg,0
    7.        
    8.         .else
    9.         mov eax,FALSE
    10.         ret
    11.         .endif
    12.         mov  eax,TRUE
    13.         ret
    14. DlgProc endp
     
  11. Eretic

    Eretic New Member

    Публикаций:
    0
    ыыы забыл добавить что всё равно не работает:). Вообще непонимаю чего нехватает
     
  12. G13

    G13 New Member

    Публикаций:
    0
    Или убираем "#define IDD_DLG1 3000" из DialogDlg.rc, или пишем так:

     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Eretic
    Верно, что изменили hInst на hInstance, т.к. hInst - локальная неинициализированная переменная... разумеется, что ф-ия DialogBoxParam не могла найти ресурсы неизвестно где.
    Непонятно, зачем заменили DialogBoxParam на CreateDialogParam. Разница лишь в том, модальным ли будет диалог. Ну и разумеется, передавать надо не строку "IDD_DLG1", а само значение IDD_DLG1, т.е. в Вашем случае 3000.
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Eretic
    Да... верно G13 насчёт addr подметил. Либо addr, либо как в приложенном исходнике вообще без offset или addr. Т.е. в приложенном файле было в этом месте верно.
     
  15. Eretic

    Eretic New Member

    Публикаций:
    0
    l_inc, G13 спасибо огромное!
    ПыСы: истина была так рядом:)