Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.127.141] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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 @ у меня нет на нем кнопок в том-то и дело, только календарь. Т.е. у тебя диалог с одним контролом? Зачем тебе вообще тогда этот диалог? Просто отобрази сам контрол в виде окна. |