На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Закрытие диалога при потере фокуса
Собственно вопрос, как отловить момент когда диалог потерял фокус.
OnKillFocus?
Мне кажется OnKillFocus не то. Ситуация следующая: Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать :)
Цитата Sander @
Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать

В OnInitDialog сделай SetCapture, чтоб в твой диалог приходили все сообщения от мыши.
Потом, по сообщению WM_LBUTTONDOWN проверь координаты, где была нажата мышь. Если вне окна диалога, делай ReleaseCapture и закрывай диалог.
Сделал как написано, действительно по щелчку мыши за пределами диалога закрывается. Непонятно только почему внутри диалога мышью ничего сделать не получается. Курсор бегает но на клики не реагирует.
Цитата Sander @
Непонятно только почему внутри диалога мышью ничего сделать не получается. Курсор бегает но на клики не реагирует.


Потому что контролам не приходят сообщения от мыши. Надо где-то в другом месте SetCapture вызывать, например по WM_MOUSEMOVE
В WM_MOUSEMOVE тоже самое
Цитата Sander @
В WM_MOUSEMOVE тоже самое

Соответственно, когда заходишь в пределы окна, делай ReleaseCapture

Добавлено
Там вроде ещё WM_ACTIVATE должно приходить, когда окно теряет фокус
Олег М большое спасибо! Вопрос решен.

в обработчике WM_MOUSEMOVE сделал следующим образом:

ExpandedWrap disabled
    CRect rc_dlg;
     
    POINT pt;
     
    GetWindowRect(&rc_dlg);
     
    rc_dlg.DeflateRect(10, 10, 10, 10); // без этого почему-то не срабатывало
     
    if(PtInRect(&rc_dlg, &pt))
    {
        ReleaseCapture();
    }
    else
    {
        SetCapture();
    }
Цитата Sander @
Вопрос решен.

в обработчике WM_MOUSEMOVE сделал следующим образом:

Это корявое решение для диалога. Там приходит сообщение WM_ACTIVATE c wParam = WA_INACTIVE. Делай по нему EndDialog() и всё.
Цитата Sander @
Мне кажется OnKillFocus не то. Ситуация следующая: Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать :)

написать обрабоьчик onclick формы :D
Можно подробнее?
Цитата Sander @
Можно подробнее?

а это модальное окно, тогда нормально закрывать по нажатию кнопки OK диалога :D
:) у меня нет на нем кнопок в том-то и дело, только календарь.
Цитата Sander @
у меня нет на нем кнопок в том-то и дело, только календарь.

Т.е. у тебя диалог с одним контролом? Зачем тебе вообще тогда этот диалог? Просто отобрази сам контрол в виде окна.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1351 ]   [ 20 queries used ]   [ Generated: 22.09.18, 03:27 GMT ]