Приветствую всех кто зашёл в темку! Проблема в следующем. Сделал на Си окно с меню. Из элемента меню вызывается модальное окно. Решил повторить в асме. Сделал окно, меню. Нажал Проект->новый->диалог. Чтобы визуально располагать. В описании диалога dia.dlg который находится в Added files написано: Код (Text): #define IDD_DLG1 1000 IDD_DLG1 DIALOGEX 6,6,194,102 CAPTION "IDD_DLG" FONT 8,"MS Sans Serif",400,0 STYLE 0x10CF0000 EXSTYLE 0x00000000 BEGIN END далее в коде: Код (Text): ...;процедура модального окна пустая. поставил в начале чтобы прототип не делать AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ret AboutDlgProc endp ... WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hInst:HINSTANCE ... ;проверка на нажатие invoke DialogBoxParam,hInst,1000,hWnd,AboutDlgProc,0 вопросы: 1) можно ли добавлять диалог так как сделал я? 2) ошибок нет, но окно не появляется. В чём может быть ошибка? 3) почему DialogBox не воспринимает а DialogBoxParam да? Заранее огромное спасибо!
блин...допиши в AboutDlgBox Код (Text): AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov eax,msg cmp eax,WM_INITDIALOG jnz @F xor eax,eax inc eax ret @@: cmp eax,WM_CLOSE jnz @F invoke EndDialog,hwnd,0 xor eax,eax inc eax ret @@: xor eax,eax ret AboutDlgProc endp
1nsidE ничем не помогло. и вообще при чём тут код процедуры? Процедура обрабатывает диалоговое окно. а вызывает это окно DialogBoxParam. Мне как раз и нужно вызвать.
1nsidE 1) читаю ещё как. Может быть ткнёшь какой именно туториал? 2) линкую в радасме. незнаю как ресурс диалога, но остальные ресурсы нормально прилинковываются
Eretic Можно. С поправкой на то, что где-то что-то не так делаете. Приаттачте архив всего проекта. Чего гадать по звёздам-то? Потому что DialogBox - это сишный макрос, а не API-функция.
Думал сам разберусь но чтото блин не врубаюсь в чём ошибка. Код маленький. Плиз кто сможет просмотрите.
Eretic Если процедура диалога ничего не делает, то должен возвратиться FALSE, так что тело процедуры такое: Код (Text): AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM xor eax, eax ret AboutDlgProc endp А у тебя - просто: Код (Text): AboutDlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ret AboutDlgProc endp Теперь далее, есть подозрение, что только "xor eax, eax" недостаточно. Такой диалог невозможно будет закрыть, так как нет обработчиков WM_COMMAND на кнопки OK и CANCEL. Даже если таких кнопок нет - эти события всё равно будут посланы диалогу. Например, при нажатии "Close" кнопки [Х] или при нажатии клавиши "Esc".
Добавил вот так: Код (Text): hwndDlg dd 0 и вот так вместо моей процедуры и вызова: Код (Text): invoke CreateDialogParam,hInstance,ADDR DlgName,hWnd,OFFSET DlgProc,NULL Код (Text): DlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM .if iMsg==WM_INITDIALOG .elseif iMsg==WM_CLOSE invoke EndDialog,hWnd,NULL mov hwndDlg,0 .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp
Eretic Верно, что изменили hInst на hInstance, т.к. hInst - локальная неинициализированная переменная... разумеется, что ф-ия DialogBoxParam не могла найти ресурсы неизвестно где. Непонятно, зачем заменили DialogBoxParam на CreateDialogParam. Разница лишь в том, модальным ли будет диалог. Ну и разумеется, передавать надо не строку "IDD_DLG1", а само значение IDD_DLG1, т.е. в Вашем случае 3000.
Eretic Да... верно G13 насчёт addr подметил. Либо addr, либо как в приложенном исходнике вообще без offset или addr. Т.е. в приложенном файле было в этом месте верно.