Hi, All! Народ, что-то я туплю с утра. Попросили лабу написать с менюшкой и показом диалога на TASM’е максимально простым/классическим способом, наступил уже на все детские грабли какие мог, убил целый час. Позор на мою седую голову. Последняя проблема: все работает, но только под Win98, в WinXP диалог глючит – не выводится само окно, только его контролы. Последние, кстати, работают как от них требуется. Код следующий: Код (Text): ; по пункту меню @@idmabout: push 0 push offset AboutDlgProc push @@hwnd push dword ptr IDD_ABOUTDLG push hInst call DialogBoxParamA jmp @@exit @@exit: mov eax, 0 ret Код (Text): ; процедура диалога AboutDlgProc proc arg @@hdlg:DWORD, @@message:DWORD, @@wparam:DWORD, @@lparam:DWORD uses eax, ebx, edi, esi mov eax, @@message cmp ax, WM_INITDIALOG je @@wminitdialog cmp ax, WM_COMMAND jne @@retun_false mov ebx, @@wparam ;в bx идентификатор элемента управления cmp bx, IDOK je @@idok jmp @@retun_false @@wminitdialog: jmp @@retun_true @@idok: push NULL push @@hdlg call EndDialog jmp @@retun_true @@retun_false: mov eax, 0 ret @@retun_true: mov eax, 1 ret AboutDlgProc endp Грешным делом уже попробовал через DialogBoxParamW, эффект тот же. Где же я тут лажаю? P.S. Перлы типа "mov eax, 0", там вполне осмыслены – для наглядности программки. А то еще заставят объяснять "что такое отпимизация?" и главное "зачем?".
И сделай InitCommonControls(Ex), если в контролах есть что-то отличное от кнопок/статиков/едитов. хех, угораздило
Без него контролы не рисуются. А когда контролы есть, но не видно само окно, возможно надо убрать из описания диалога WS_CLIPCHILDREN или WS_CLIPSIBLINGS. Не помню какой из них точно...
:2: afybc А смысл? Это же хендрел парента. С нулем будет цеплять за десктоп. Впрочем, проверил – все тоже самое и цепляется за десктоп... :2: rmn Код (Text): 22000 DIALOGEX 100, 50, 231, 73, 0 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME | WS_CAPTION CAPTION "О программе..." FONT 8, "MS Sans Serif", 0, 0 BEGIN ICON 129, 22001, 7, 8, 21, 20 LTEXT "Приложение Win32 на ассемблере", 22002, 42, 7, 182, 8, SS_NOPREFIX LTEXT "Версия", 22003, 42, 20, 25, 8, SS_NOPREFIX LTEXT "", 22004, 72, 20, 152, 8 LTEXT "Copyright © 2006", 22005, 42, 32, 182, 10 DEFPUSHBUTTON "&OK", IDOK, 89, 51, 50, 14, WS_GROUP END Описание диалога, отковырял от собственной работающей программки. Там вроде все нормально. Впрочем, сносил все к минимуму - результат тот же. :2: IceStudent Кнопка там только и статы, ICON погоду не делает, но InitCommanControls сейчас попробую.
:2: koderr Оно! Момент истины! Спасибо! Где были мои глаза? Остается только посыпать голову пеплом. :2: All Всем спасибо за участие! Все-таки языки высокого уровня в чем-то отупляют, или как минимум делают ленивым. Сто лет уже ничего не писал на чистом асме - все вставки, да дебагеры и вот результат - заблудился в трех соснах. Пойду теперь в наказание писать подробные комментарии к этой поделке.
я хочу попросить помощи в формате этой темы: никак не получается заставить кнопки диалога работать. Код (Text): redsI_Proc proc lparam equ dword ptr [ebp+014h] wparam equ dword ptr [ebp+10h] msg equ dword ptr [ebp+0Ch] hwnd equ dword ptr [ebp+08h] cmp msg, WM_INITDIALOG je initdialog_m ;усли ДА то на метку %1 cmp msg, WM_COMMAND je comdialog_m ;если ДА cmp msg, WM_CLOSE jne return_false push 0 push hWnd1 call EndDialog@8 jmp return_false ;%1 initdialog_m: push IDC_EDIT1 push hwnd1 call GetDlgItem@8 push eax call SetFocus@4 ; push 0 ; push 0 ; push OPEN_ALWAYS ; push 0 ; push 0 ; push GEN ; push offset opt_name ; call CreateFileA@28 jmp return_true comdialog_m: mov eax, wParam mov ebx, lParam test ebx, 0 jnz com2_m cmp ax, IDM_GETTEXT jne nexti_m push 512 push offset buf push IDC_EDIT1 push hWnd1 call GetDlgItemTextA@16 nexti_m: cmp ax, IDM_CLEAR jne nexix_m push 0 push IDC_EDIT1 push hWnd call SetDlgItemTextA@12 nexix_m: push 0 push hWnd call EndDialog@8 com2_m: mov edx, wParam shr edx, 010h cmp dx, BN_CLICKED jne return_true cmp ax, IDC_BUTTON1 jne com3_m push offset String push IDC_EDIT1 push hWnd1 call SetDlgItemTextA@12 push 0 push hWnd1 call EndDialog@8 jmp return_true com3_m: cmp ax, IDC_CANCEL jne return_true push 0 push hWnd call EndDialog@8 jmp return_true return_false: mov eax, FALSE ret return_true: mov eax, TRUE ret game_over: redsI_Proc endp
По test ebx, 0 всегда ZF = 1. Соответственно не выполняется Код (Text): cmp ax, IDM_GETTEXT jne nexti_m push 512 push offset buf push IDC_EDIT1 push hWnd1 call GetDlgItemTextA@16 nexti_m: cmp ax, IDM_CLEAR jne nexix_m push 0 push IDC_EDIT1 push hWnd call SetDlgItemTextA@12 Если проверяешь на равенство нулю, то исправь на test ebx, ebx