Немодальные диалоги (инициализация элементов) и IsDialogMessage

Тема в разделе "WASM.WIN32", создана пользователем RDMess, 12 авг 2011.

  1. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Здравствуйте.
    В общем у меня два вопроса.. Первый.. как узнать что все элементы немодального диалога создались, чтобы можно было настроить некоторые из них(получить хенд или изменить прямоугольник прорисовки в Edit-е. см. ниже) пытался сделать это в WM_INITDIALOG но там всё в холостую, элементы не успевают создаться.

    Второй вопрос... нужно ли для каждого немодального диалога в цикле сообщений вызывать IsDialogMessage,hDlg,ADDR msg...IsDialogMessage,hDlg1,ADDR msg ...IsDialogMessage,hDlg2,ADDR msg или же существует более изящный вариант ?


    P.S. Немодальные диалоги со стилем WS_CHILD, WS_CHILDWINDOW... и имеют одну каллбек функцию на всех.
    Код (Text):
    1. WinMain proc hInstance:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    2. ...
    3. MOV  wc.lpfnWndProc, OFFSET WndProc
    4. ....
    5.  
    6.          INVOKE CreateWindowEx,NULL,ADDR szWindowText,ADDR szWindowText,WS_CAPTION    +WS_SYSMENU+WS_VISIBLE,\
    7.                                                        CW_USEDEFAULT,CW_USEDEFAULT,778,496,NULL,NULL,hInstance,NULL
    8.         MOV  hwnd,EAX
    9.         MOV  hGlobal,EAX
    10.         INVOKE ShowWindow,hwnd,CmdShow
    11.         INVOKE UpdateWindow,hwnd
    12.  
    13.         .WHILE TRUE
    14.            invoke GetMessage, ADDR msg,NULL,0,0
    15.            .BREAK .IF (!EAX)
    16.            invoke IsDialogMessage,hDlg,ADDR msg
    17.            ;invoke IsDialogMessage,hDlg1,ADDR msg
    18.            ;invoke IsDialogMessage,hDlg2,ADDR msg
    19.            .IF EAX==FALSE
    20.              invoke TranslateMessage, ADDR msg
    21.              invoke DispatchMessage, ADDR msg
    22.            .ENDIF
    23.         .ENDW
    24.          MOV EAX,msg.wParam
    25.       RET
    26.     WinMain
    27.  
    28.  
    29. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    30.        .IF uMsg==WM_CREATE
    31.             INVOKE CreateDialogParam,hInst,1000,hWnd,\;
    32.                                            ADDR DlgProc,ADDR app
    33.            MOV hDlg13,EAX
    34.            INVOKE CreateDialogParam,hInst,1005,hWnd,\;
    35.                                            ADDR DlgProc,1005
    36.            MOV hDlg,EAX
    37.            INVOKE CreateDialogParam,hInst,1030 ,hWnd,\;
    38.                                            ADDR DlgProc,ADDR app
    39.  
    40. ...
    41.  
    42.  
    43. DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    44.         .IF uMsg==WM_INITDIALOG
    45.              INVOKE SendDlgItemMessage,hDlg,1012,EM_GETRECT,0,ADDR rc
    46.                  MOV rc.top,2
    47.                  MOV rc.bottom,17
    48.                  INVOKE SendDlgItemMessage,hDlg,1012,EM_SETRECT,0,ADDR rc
    49.                  INVOKE SendDlgItemMessage,hDlg,1013,EM_SETRECT,0,ADDR rc          
    50.                  ; Вот тут не срабатывают настройки элемента Edit
    51. .....
    Искал ответ на форуме, но увы, если пропустил извините.. Заранее спасибо.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Присвоение хендлов диалога переменным hDlgXXX происходит после сообщения WM_INITDIALOG, поэтому вызовы
    получают первым параметром мусор.
     
  3. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Код (Text):
    1.    DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    2.          LOCAL rc:RECT
    3.         .IF uMsg==WM_INITDIALOG
    4.             CMP lParam,1005
    5.              JNE @@End
    6.                  ;INVOKE RtlZeroMemory,ADDR rc,SIZEOF RECT
    7.                  INVOKE SendDlgItemMessage,hWnd,1012,EM_GETRECT,0,ADDR rc
    8.                  MOV rc.top,2
    9.                  MOV rc.bottom,17
    10.                  INVOKE SendDlgItemMessage,hWnd,1012,EM_SETRECT,0,ADDR rc
    11.                  INVOKE SendDlgItemMessage,hWnd,1013,EM_SETRECT,0,ADDR rc
    12.              @@End:
    13. ...
    Спасибо, с этим разобрались... а что скажете на счет IsDialogMessage ?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    вероятно, можно так:
    Код (Text):
    1. while(GetMessage(&msg, NULL, 0, 0))
    2. {
    3.     if ((msg.hwnd == hDlg1 ||
    4.         msg.hwnd == hDlg2 ||
    5.         ... ) &&
    6.         IsDialogMessage(msg.hwnd, &msg)) continue;
    7.    
    8.     TranslateMessage(&msg);
    9.     DispatchMessage(&msg);
    10. }
    попробуй
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Проверки там лишние в цикле. Просто передача в IsDialogMessage() хэндла диалога и адреса сообщения достаточно. Если функция возвратила TRUE - значит не надо далее искать.
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    AsmGuru62
    вопрос был в том, что делать, если хендлов диалогов несколько. Для каждого вызывать IsDialogMessage?
     
  7. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Верно, а диалоги мне эти нужны чтобы изменяя родителя можно было перемещать контролы на другие формы в программе.
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    rmn
    Делается массив хэндлов.
    Когда диалог открывается (например через CreateDialogParam) его хендл заносится в массив.
    Диалог закрывается - найти и убрать хэндл из массива.
    Ну и в цикле этом - пройтись по массиву и если какой то хендл возвратит TRUE - не вызывать пару:
    TranslateMessage/DispatchMessage.
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    AsmGuru62
    Суть не в том, как хранятся хендлы (в массиве или отдельными переменными), а в том, стоит ли заменять одну маш. инструкцию cmp вызовом IsDialogMessage, которая в свою очередь выполнит десятки (если не сотни) инструкций, чтобы определить, является ли переданный ей хендл и сообщение диалоговыми.

    Ведь если msg.hwnd != hDlgXXX (или msg.hwnd != Handles), то это сообщение точно не для наших немодальных диалогов и можно просто передать его в DispatchMessage().