Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.10.137] |
|
Сообщ.
#1
,
|
|
|
Собственно вопрос, как отловить момент когда диалог потерял фокус.
|
Сообщ.
#2
,
|
|
|
OnKillFocus?
|
Сообщ.
#3
,
|
|
|
Мне кажется OnKillFocus не то. Ситуация следующая: Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать
|
Сообщ.
#4
,
|
|
|
Цитата Sander @ Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать В OnInitDialog сделай SetCapture, чтоб в твой диалог приходили все сообщения от мыши. Потом, по сообщению WM_LBUTTONDOWN проверь координаты, где была нажата мышь. Если вне окна диалога, делай ReleaseCapture и закрывай диалог. |
Сообщ.
#5
,
|
|
|
Сделал как написано, действительно по щелчку мыши за пределами диалога закрывается. Непонятно только почему внутри диалога мышью ничего сделать не получается. Курсор бегает но на клики не реагирует.
|
Сообщ.
#6
,
|
|
|
Цитата Sander @ Непонятно только почему внутри диалога мышью ничего сделать не получается. Курсор бегает но на клики не реагирует. Потому что контролам не приходят сообщения от мыши. Надо где-то в другом месте SetCapture вызывать, например по WM_MOUSEMOVE |
Сообщ.
#7
,
|
|
|
В WM_MOUSEMOVE тоже самое
|
Сообщ.
#8
,
|
|
|
Цитата Sander @ В WM_MOUSEMOVE тоже самое Соответственно, когда заходишь в пределы окна, делай ReleaseCapture Добавлено Там вроде ещё WM_ACTIVATE должно приходить, когда окно теряет фокус |
Сообщ.
#9
,
|
|
|
Олег М большое спасибо! Вопрос решен.
в обработчике WM_MOUSEMOVE сделал следующим образом: CRect rc_dlg; POINT pt; GetWindowRect(&rc_dlg); rc_dlg.DeflateRect(10, 10, 10, 10); // без этого почему-то не срабатывало if(PtInRect(&rc_dlg, &pt)) { ReleaseCapture(); } else { SetCapture(); } |
Сообщ.
#10
,
|
|
|
Цитата Sander @ Вопрос решен. в обработчике WM_MOUSEMOVE сделал следующим образом: Это корявое решение для диалога. Там приходит сообщение WM_ACTIVATE c wParam = WA_INACTIVE. Делай по нему EndDialog() и всё. |
Сообщ.
#11
,
|
|
|
Цитата Sander @ Мне кажется OnKillFocus не то. Ситуация следующая: Создаю дочерний диалог и вывожу его на экран SetWindowPos. Как только я щелкаю мышью на основной форме то этот диалог должен закрыться. Никак не соображу как это лучше сделать написать обрабоьчик onclick формы |
Сообщ.
#12
,
|
|
|
Можно подробнее?
|
Сообщ.
#13
,
|
|
|
Цитата Sander @ Можно подробнее? а это модальное окно, тогда нормально закрывать по нажатию кнопки OK диалога |
Сообщ.
#14
,
|
|
|
у меня нет на нем кнопок в том-то и дело, только календарь.
|
Сообщ.
#15
,
|
|
|
Цитата Sander @ у меня нет на нем кнопок в том-то и дело, только календарь. Т.е. у тебя диалог с одним контролом? Зачем тебе вообще тогда этот диалог? Просто отобрази сам контрол в виде окна. |
Сообщ.
#16
,
|
|
|
О как! Вообще у меня контрол порожденный от CEdit c кнопкой. У меня просто в нем дофига доп функций, типа ввода по маске и т.д. Вот и хочу по кнопке вызывать календарь и закрывать если мимо ткнул мышкой. В 6-й студии все работало, правда там я извратился с таймером, если окно не в фокусе больше секунды то закрываем диалог, коряво согласен, но тогда меня устроило. А сейчас захотелось библиотеку перенести в 2013 студию и хочется сделать правильно. Вот как-то так.
|
Сообщ.
#17
,
|
|
|
Цитата Sander @ Вообще у меня контрол порожденный от CEdit c кнопкой. У меня просто в нем дофига доп функций, типа ввода по маске и т.д. Вот и хочу по кнопке вызывать календарь и закрывать если мимо ткнул мышкой. Т.е. что-то типа комбо-бокса? Там диалог не нужен, создавай календарь через CreateWindow(...WS_POPUP...), сразу делай для него SetCapture и т.д. |
Сообщ.
#18
,
|
|
|
Не пойму а как тогда в контроле определить состояние курсора? Вывести его на экран положим не проблема, а как организовать взаимодействие, я что-то затрудняюсь
|
Сообщ.
#19
,
|
|
|
Цитата Sander @ Не пойму а как тогда в контроле определить состояние курсора? Вывести его на экран положим не проблема, а как организовать взаимодействие, я что-то затрудняюсь Что значит "определить состояние курсора" и что значит "организовать взаимодействие"? |
Сообщ.
#20
,
|
|
|
Ну контрол должен как-то узнать что он не активен и самоуничтожиться
|
Сообщ.
#21
,
|
|
|
Цитата Sander @ если окно не в фокусе больше секунды то закрываем диалог, А ты возьми и сделай так - если тайм-аут наступил, начинай плавно увеличивать прозрачность этого окошка. Вплоть до почти полной невидимости. А когда поверх пройдёт мышь, сделай окошко 100% видимым. Добавлено Цитата Sander @ У меня просто в нем дофига доп функций, типа ввода по маске и т.д. Не обязательно делать дополнительный контрол в отдельном диалоге. Размести на основном диалоге мааааленькую кнопочку. С номером страницы. Это будет переключатель страниц. Переключил страницу - увидел календарь. (Или основной диалог.) Время прошло, таймер переключил страницу назад. |
Сообщ.
#22
,
|
|
|
Цитата Sander @ Ну контрол должен как-то узнать что он не активен и самоуничтожиться Ты же вроде уже сделал, через SetCapture. Здесь ещё проще, окно только одно, можно сразу после CreateWindow сделать SetCapture, а при нажатии мышки за переделами окна - ReleaseCapture и DestroyWindow Добавлено Или ты имеешь ввиду, что это не твой контрол и ты не знаешь как обрабатывать его сообщения? Там можно как-то переопределить процедуру окна, SubclassWindow или что-то типа того. |