Конференция "Компоненты" » TWinControl, отлов WM_ENABLE или потери фокуса [D7]
 
  • DmitryAB (25.02.15 12:02) [0]
    Написал обертку (https://github.com/da-baranov/scide) для популярного в определенных кругах Sciter (http://terrainformatica.com/sciter).

    Sciter предоставляет наружу Plain C API и работает просто: внедряет свой обработчик сообщений в оконную процедуру окна-контейнера, обрабатывает те сообщения, которые ему нужны и не обрабатывает те, которые не нужны.

    Обнаружилась вот какая VCL-специфическая проблема.
    Если Sciter помещен на форму как WS_CHILD и отображает модальный диалог (аналог window.alert в JavaScript), то закрыть этот диалог мышью нельзя.

    Причина этого по-видимому вот в чем:
    а) модальный диалог из Sciter рекурсивно вызывает EnableWindow(False) всем родительским окнам вплоть до главной формы
    б) при этом срабатывает обратный механизм VCL, который ловит WM_ENABLE или аналогичное внутреннее сообщение Delphi и проделывает то же самое, только в другую строну - рекурсивно дизаблит дочерние окна главной формы, в том числе и тот контрол, который хостит в себе оконную процедуру Sciter
    в) тот в свою очередь делает disabled модальному диалогу.

    Получается как бы такое самоубийство.
    Не понимаю, как эту ситуацию грамотно отработать. Задача вырисовывается такая: окно, которое хостит Sciter, должно, как и задумывал автор Sciter, задизаблиться, но при этом окно модального диалога должно остаться Enabled и реагировать на мышь

    Что пробовал:
    1) ApplicationEvents - его использование само по себе не очень красиво, ну и собственно после того, как модальный диалог вешает главную форму, в очередь приложения перестают поступать вообще все сообщения, кроме WM_PAINT и WM_ERASEBKGND.
    2) WM_ENABLE и CM_ENABLEDCHANGED в наследнике TWinControl, который хостит Sciter, не ловятся вообще, ни в WndProc, ни отдельными процедурами-обработчиками этих сообщений
    3) В MFC аналогичный пример работает нормально, модальный диалог сам себя не убивает.

    Демо и доступно здесь - https://github.com/da-baranov/SciDe/releases/download/v3.2.0.4-beta.3/scide-v3.2.0.4-beta.3.zip, см. последний пример - Popups from child windows issue.
 
Конференция "Компоненты" » TWinControl, отлов WM_ENABLE или потери фокуса [D7]
Есть новые Нет новых   [134427   +34][b:0][p:0]