DialogBoxParam дважды рисует диалоговое окно.

Тема в разделе "WASM.X64", создана пользователем Rigdzin, 24 май 2024.

  1. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    Кто-нибудь растолкуйте, как такое могло случиться и что с этим делать? Причём, кнопки работают правильно, но, вот , двойная прорисовка окна..

    Вот текст ресурс-файла:
    Код (C++):
    1. #ifndef IDCANCEL
    2.   #define IDCANCEL 2
    3. #endif
    4. #include <d:\masm64\include64\Resource.h>
    5. #define IDCEDIT1 301
    6. #define IDCEDIT2 302
    7. #define GET_TEXT 401
    8. LANGUAGE 25,1
    9. MYMENU MENU
    10. BEGIN
    11.      POPUP "&File"
    12.      BEGIN
    13.         MENUITEM "&Open",101
    14.         MENUITEM SEPARATOR
    15.         MENUITEM "E&xit",102
    16.      END
    17.      POPUP "&Examples"
    18.      BEGIN
    19.         POPUP "Example 1"
    20.         BEGIN
    21.            MENUITEM "1&1",103
    22.            MENUITEM "1&2",104
    23.         END
    24.         POPUP "Example &2"
    25.         BEGIN
    26.            MENUITEM "2&1",105
    27.            MENUITEM "2&2",106
    28.         END
    29.    END
    30.   MENUITEM "&Help",111
    31. END
    32. SMDLG DIALOGEX 10,10,225,78
    33. CAPTION "Our Second Dialog Box"
    34. FONT 8,"MS Sans Serif",0,0,0
    35. STYLE WS_CAPTION|WS_SYSMENU|DS_CENTER|DS_MODALFRAME|DS_3DLOOK
    36. BEGIN
    37.   CONTROL "",IDCEDIT1,"Edit",WS_CHILDWINDOW|WS_TABSTOP|ES_AUTOHSCROLL,18,18,111,13,WS_EX_CLIENTEDGE
    38.   CONTROL "",IDCEDIT2,"Edit",WS_CHILDWINDOW|WS_TABSTOP|ES_AUTOHSCROLL,18,45,111,13,WS_EX_CLIENTEDGE
    39.   CONTROL "Get Text",GET_TEXT,"Button",WS_CHILDWINDOW|WS_TABSTOP|BS_DEFPUSHBUTTON,153,18,52,13
    40.   CONTROL "Cancel",IDCANCEL,"Button",WS_CHILDWINDOW|WS_TABSTOP,153,45,52,13
    41. END
    вот текст вызова ф-ии DialogBoxParam:
    Код (ASM):
    1. .switch uMsg
    2. .case WM_COMMAND
    3. .switch wParam
    4. .case 101
    5. invoke DialogBoxParam, hInstance, ADDR dialogname, 0, ADDR SMDlgProc, 0
    Прошу заранее простить меня, если я что-то неправильно оформил, я здесь впервые и ума не приложу, что делать со своей проблемой.
    StrangeDLG.jpg
     
    Последнее редактирование: 26 май 2024
  2. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    153
    вызов внутри "процедуры обработки сообщений" чтоли?
    DialogBoxParam() должна быть снаружи, по типу такого:

    Код (ASM):
    1. .code
    2. start:    invoke  GetModuleHandle,0
    3.           mov     [hModule],eax
    4.           invoke  DialogBoxParam, eax, 100, 0, DialogProc, 0
    5.           invoke  ExitProcess, 0
    6.  
    7. proc  DialogProc hwnddlg, msg, wparam, lparam
    8.           cmp     [msg],WM_INITDIALOG
    9.           je      @init
    10.           cmp     [msg],WM_COMMAND
    11.           je      @exit
    12.           cmp     [msg],WM_CLOSE
    13.           je      @close
    14.           cmp     [msg],WM_NOTIFY
    15.           je      @notify
    16.           jmp     @next
    17. ;......
     
  3. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    Да, вызов в процедуре обработки оконных сообщений, а где должен быть вызов? Просто вызов диалога происходит по нажатию кнопки в меню, потому и вызов DialogBoxParam делаю процедуре обработки сообщений.
    Делал по аналогии с этим текстом:
    Код (C):
    1. LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3. HDC hdc;
    4. PAINTSTRUCT ps;
    5. RECT rect;
    6. static char szAppName[] = "HelloWin";
    7. switch (iMsg)
    8. {
    9. case WM_COMMAND:
    10. switch (LOWORD(wParam))
    11. {
    12. case 101:
    13. //MessageBoxA(NULL, "Test menu Open!", szAppName, MB_OK);
    14. DialogBoxA(hInst, "SMDlg", hwnd,SMDlg);
    15. break;
    Очень рабочий код.
     
  4. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    153
    ну так и надо было сразу сказать.
    по фрагментам сложно давать какие-то советы, ведь такие глюки могут быть где-то в другом месте.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Rigdzin,
    чтобы понять, что не так с диалогом, нужно увидеть содержимое SMDlgProc
     
  6. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    153
    ..и у DialogBoxParam() один аргумент лишний - должно быть 5, а у вас их 6.
     
  7. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    Код (ASM):
    1. SMDlgProc proc hdlg:QWORD,dmsg:QWORD,wParam:QWORD,lParam:QWORD
    2. .switch dmsg
    3. ;.case WM_INITDIALOG
    4. ;.return TRUE
    5. .case WM_COMMAND
    6. .switch wParam
    7. .case 401
    8. invoke GetDlgItemText,hdlg,301,ADDR strbuff,64
    9. invoke SetDlgItemText,hdlg,302,ADDR strbuff
    10. .case IDCANCEL
    11. invoke EndDialog,hdlg,0
    12. ;.return TRUE
    13. .endsw
    14. .endsw
    15. ret
    16. SMDlgProc endp
    Только что посмотрел свой текст, у меня там пять аргументов, это я просто сюда неправильно написал.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Rigdzin,
    если нет WM_COMMAND, то ты должен вернуть EAX = 0
     
  9. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    В смысле? У меня в WM_COMMAND в диалоговой процедуре GetTextDlg иSetTextDlg а в главной процедуре нажатия меню, или это не то? Ладно, всё равно попробую..
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Rigdzin, это же ассемблер для x64? Тогда
    Код (ASM):
    1. SMDlgProc proc hdlg:QWORD,dmsg:QWORD,wParam:QWORD,lParam:QWORD
    2.       mov hdlg,rcx
    3.       cmp edx,WM_COMMAND
    4.       jne default
    5.       cmp r8d,401
    6.       jne @f
    7.       invoke GetDlgItemText,hdlg,301,ADDR strbuff,64
    8.       invoke SetDlgItemText,hdlg,302,ADDR strbuff
    9.       jmp wmBYE
    10. @@:   cmp r8d,IDCANCEL
    11.       jne  wmBYE
    12.       invoke EndDialog,hdlg,0
    13.       jmp wmBYE
    14. default:xor eax,eax
    15. wmBYE:leave
    16.      retn
    17. SMDlgProc endp
     
  11. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    Благодарю за консультацию! Буду пробовать.
     
  12. Rigdzin

    Rigdzin New Member

    Публикаций:
    0
    Регистрация:
    24 май 2024
    Сообщения:
    6
    Действительно, добавление xor rax,rax перед ret в диалоговой процедуре решило проблему. Пожалуй, если бы оно просто не работало, я бы сюда и не обращался:), всех благодарю!