На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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
  
> Закрытие диалога при потере фокуса
    Собственно вопрос, как отловить момент когда диалог потерял фокус.
      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 @
                                у меня нет на нем кнопок в том-то и дело, только календарь.

                                Т.е. у тебя диалог с одним контролом? Зачем тебе вообще тогда этот диалог? Просто отобрази сам контрол в виде окна.
                                  О как! Вообще у меня контрол порожденный от CEdit c кнопкой. У меня просто в нем дофига доп функций, типа ввода по маске и т.д. Вот и хочу по кнопке вызывать календарь и закрывать если мимо ткнул мышкой. В 6-й студии все работало, правда там я извратился с таймером, если окно не в фокусе больше секунды то закрываем диалог, коряво согласен, но тогда меня устроило. А сейчас захотелось библиотеку перенести в 2013 студию и хочется сделать правильно. Вот как-то так.
                                    Цитата Sander @
                                    Вообще у меня контрол порожденный от CEdit c кнопкой. У меня просто в нем дофига доп функций, типа ввода по маске и т.д. Вот и хочу по кнопке вызывать календарь и закрывать если мимо ткнул мышкой.


                                    Т.е. что-то типа комбо-бокса? Там диалог не нужен, создавай календарь через CreateWindow(...WS_POPUP...), сразу делай для него SetCapture и т.д.
                                      Не пойму а как тогда в контроле определить состояние курсора? Вывести его на экран положим не проблема, а как организовать взаимодействие, я что-то затрудняюсь :)
                                        Цитата Sander @
                                        Не пойму а как тогда в контроле определить состояние курсора? Вывести его на экран положим не проблема, а как организовать взаимодействие, я что-то затрудняюсь

                                        Что значит "определить состояние курсора" и что значит "организовать взаимодействие"?
                                          Ну контрол должен как-то узнать что он не активен и самоуничтожиться
                                            Цитата Sander @
                                            если окно не в фокусе больше секунды то закрываем диалог,

                                            А ты возьми и сделай так - если тайм-аут наступил, начинай
                                            плавно увеличивать прозрачность этого окошка.
                                            Вплоть до почти полной невидимости.
                                            А когда поверх пройдёт мышь, сделай окошко 100% видимым.

                                            Добавлено
                                            Цитата Sander @
                                            У меня просто в нем дофига доп функций, типа ввода по маске и т.д.

                                            Не обязательно делать дополнительный контрол в отдельном диалоге.
                                            Размести на основном диалоге мааааленькую кнопочку. С номером страницы.
                                            Это будет переключатель страниц.
                                            Переключил страницу - увидел календарь. (Или основной диалог.)
                                            Время прошло, таймер переключил страницу назад.
                                              Цитата Sander @
                                              Ну контрол должен как-то узнать что он не активен и самоуничтожиться

                                              Ты же вроде уже сделал, через SetCapture. Здесь ещё проще, окно только одно, можно сразу после CreateWindow сделать SetCapture, а при нажатии мышки за переделами окна - ReleaseCapture и DestroyWindow

                                              Добавлено
                                              Или ты имеешь ввиду, что это не твой контрол и ты не знаешь как обрабатывать его сообщения? Там можно как-то переопределить процедуру окна, SubclassWindow или что-то типа того.
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0453 ]   [ 17 queries used ]   [ Generated: 19.04.24, 22:35 GMT ]