Кто-нибудь растолкуйте, как такое могло случиться и что с этим делать? Причём, кнопки работают правильно, но, вот , двойная прорисовка окна.. Вот текст ресурс-файла: Код (C++): #ifndef IDCANCEL #define IDCANCEL 2 #endif #include <d:\masm64\include64\Resource.h> #define IDCEDIT1 301 #define IDCEDIT2 302 #define GET_TEXT 401 LANGUAGE 25,1 MYMENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "&Open",101 MENUITEM SEPARATOR MENUITEM "E&xit",102 END POPUP "&Examples" BEGIN POPUP "Example 1" BEGIN MENUITEM "1&1",103 MENUITEM "1&2",104 END POPUP "Example &2" BEGIN MENUITEM "2&1",105 MENUITEM "2&2",106 END END MENUITEM "&Help",111 END SMDLG DIALOGEX 10,10,225,78 CAPTION "Our Second Dialog Box" FONT 8,"MS Sans Serif",0,0,0 STYLE WS_CAPTION|WS_SYSMENU|DS_CENTER|DS_MODALFRAME|DS_3DLOOK BEGIN CONTROL "",IDCEDIT1,"Edit",WS_CHILDWINDOW|WS_TABSTOP|ES_AUTOHSCROLL,18,18,111,13,WS_EX_CLIENTEDGE CONTROL "",IDCEDIT2,"Edit",WS_CHILDWINDOW|WS_TABSTOP|ES_AUTOHSCROLL,18,45,111,13,WS_EX_CLIENTEDGE CONTROL "Get Text",GET_TEXT,"Button",WS_CHILDWINDOW|WS_TABSTOP|BS_DEFPUSHBUTTON,153,18,52,13 CONTROL "Cancel",IDCANCEL,"Button",WS_CHILDWINDOW|WS_TABSTOP,153,45,52,13 END вот текст вызова ф-ии DialogBoxParam: Код (ASM): .switch uMsg .case WM_COMMAND .switch wParam .case 101 invoke DialogBoxParam, hInstance, ADDR dialogname, 0, ADDR SMDlgProc, 0 Прошу заранее простить меня, если я что-то неправильно оформил, я здесь впервые и ума не приложу, что делать со своей проблемой.
вызов внутри "процедуры обработки сообщений" чтоли? DialogBoxParam() должна быть снаружи, по типу такого: Код (ASM): .code start: invoke GetModuleHandle,0 mov [hModule],eax invoke DialogBoxParam, eax, 100, 0, DialogProc, 0 invoke ExitProcess, 0 proc DialogProc hwnddlg, msg, wparam, lparam cmp [msg],WM_INITDIALOG je @init cmp [msg],WM_COMMAND je @exit cmp [msg],WM_CLOSE je @close cmp [msg],WM_NOTIFY je @notify jmp @next ;......
Да, вызов в процедуре обработки оконных сообщений, а где должен быть вызов? Просто вызов диалога происходит по нажатию кнопки в меню, потому и вызов DialogBoxParam делаю процедуре обработки сообщений. Делал по аналогии с этим текстом: Код (C): LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static char szAppName[] = "HelloWin"; switch (iMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case 101: //MessageBoxA(NULL, "Test menu Open!", szAppName, MB_OK); DialogBoxA(hInst, "SMDlg", hwnd,SMDlg); break; Очень рабочий код.
ну так и надо было сразу сказать. по фрагментам сложно давать какие-то советы, ведь такие глюки могут быть где-то в другом месте.
Код (ASM): SMDlgProc proc hdlg:QWORD,dmsg:QWORD,wParam:QWORD,lParam:QWORD .switch dmsg ;.case WM_INITDIALOG ;.return TRUE .case WM_COMMAND .switch wParam .case 401 invoke GetDlgItemText,hdlg,301,ADDR strbuff,64 invoke SetDlgItemText,hdlg,302,ADDR strbuff .case IDCANCEL invoke EndDialog,hdlg,0 ;.return TRUE .endsw .endsw ret SMDlgProc endp Только что посмотрел свой текст, у меня там пять аргументов, это я просто сюда неправильно написал.
В смысле? У меня в WM_COMMAND в диалоговой процедуре GetTextDlg иSetTextDlg а в главной процедуре нажатия меню, или это не то? Ладно, всё равно попробую..
Rigdzin, это же ассемблер для x64? Тогда Код (ASM): SMDlgProc proc hdlg:QWORD,dmsg:QWORD,wParam:QWORD,lParam:QWORD mov hdlg,rcx cmp edx,WM_COMMAND jne default cmp r8d,401 jne @f invoke GetDlgItemText,hdlg,301,ADDR strbuff,64 invoke SetDlgItemText,hdlg,302,ADDR strbuff jmp wmBYE @@: cmp r8d,IDCANCEL jne wmBYE invoke EndDialog,hdlg,0 jmp wmBYE default:xor eax,eax wmBYE:leave retn SMDlgProc endp
Действительно, добавление xor rax,rax перед ret в диалоговой процедуре решило проблему. Пожалуй, если бы оно просто не работало, я бы сюда и не обращался, всех благодарю!