Помирить окна

Тема в разделе "WASM.DirectX", создана пользователем SolidCode, 13 июл 2005.

  1. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    У меня два окна. Одно оконное DX8.1. Другое диалоговое. При выборке сообщений диалоговое перестаёт отвечать на запросы и клики. Добавление IsDialogMessage() решило часть проблемы, но само окно упорно висит, хотя DX-ное работает. Вот цикл сообщений.
    Код (Text):
    1.  
    2.             lea     esi,msg
    3.             assume esi:ptr MSG
    4.             ;message loop is built for maximum speed
    5. align 16
    6. @nextmsg:
    7.             invoke  PeekMessage,esi,0,0,0,PM_REMOVE
    8.             .if eax==NULL
    9.                 invoke  OutWinRenderScene,ebx
    10.                 invoke  Sleep,1
    11.                 jmp     @nextmsg
    12.             .endif
    13.             ;invoke  GetMessage,esi,0,0,0
    14.             mov     eax,[esi].message
    15.             .if eax!=WM_QUIT
    16.                 invoke  IsDialogMessage,[ebx].hParentWin,esi
    17.                 test    eax,eax
    18.                 jnz     @nextmsg
    19.                 invoke  TranslateMessage,esi
    20.                 invoke  DispatchMessage,esi
    21.                 jmp     @nextmsg
    22. ;                push    esi
    23. ;                mov     eax,dword ptr [DispatchMessage+2]
    24. ;                push    offset @nextmsg
    25. ;                jmp     dword ptr [eax]
    26.             .endif
    27.             mov     eax,[esi].wParam
    28.             mov     nExitCode,eax
    29.  




    А я хочу потом ещё третье окно вводить. Тоже оконное DX.

    Что делать?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Может бред, но попробуй вместо



    invoke PeekMessage,esi,0,0,0,PM_REMOVE



    сделать



    invoke PeekMessage,esi,0,0,0,PM_NOREMOVE

    invoke GetMessage, ...
     
  3. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    проверь возвращаемые значения из dialogproc

    часто бывает что в этом причина проблем
     
  4. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Спасибо, ребята!

    Я уже сам разобрался. Стал убирать DX вообще - проблема не уходит. Сделал обычный цикл через GetMessage - без изменений. Наконец нашёл, что не указал класс диалогового окна. После этого всё пошло как по маслу. Staier в принципе был близок к решению, но решить было невозможно с имеющейся информацией.



    _DEN_

    Это не бред. Но в моих испытаниях разницы я не заметил.

    Есть ещё один вариант. Использовать GetQueueStatus(QS_ALLINPUT);

    Это ещё более быстрый способ узнать ситуацию с очередью сообщений.