Правильный способ заставить всплывающее окно wxWidgets закрываться при нажатии родителя?

Предисловие: проект wxWidgets 2.8.10 для Windows.

У меня есть главное окно приложения (элементы управления в рамке). Если пользователь нажимает горячую клавишу, всплывающее окно (реализованное как wxDialog) отображается по центру родителя.

Поведение, которое я хочу, заключается в том, что если пользователь щелкает за пределами всплывающего окна в родительском окне, тогда всплывающее окно будет закрыто, как EndModal (wxID_CANCEL).

Но если пользователь щелкнет за пределами всплывающего окна в другое приложение, всплывающее окно должно остаться там.

Есть предположения?


person Adam Vandenberg    schedule 04.11.2009    source источник


Ответы (2)


Как насчет обработки EVT_KILL_FOCUS во всплывающем окне? Щелчок за пределами вашего окна сделает окно, на которое был сделан щелчок, получит фокус.

person BuschnicK    schedule 11.11.2009
comment
Есть ли способ узнать, произошло ли убийство фокуса из-за щелчка в другом окне в моем приложении или из-за щелчка в другом приложении? - person Adam Vandenberg; 12.11.2009
comment
Ну, где-то есть глобальная переменная, хранящая текущее окно фокуса. Я наткнулся на это во время отладки исходного кода. Забыли, где это было и было ли оно в открытом доступе. В любом случае wxApp::IsActive может быть лучшим выбором. Обработайте EVT_KILL_FOCUS и используйте wxApp::IsActive, чтобы узнать, потеряло ли фокус все приложение или только окно. - person BuschnicK; 12.11.2009

Если вы хотите, чтобы диалоговое окно закрывалось при нажатии мыши за пределами его области экрана, вам нужно поймать щелчки мыши. К сожалению, родительская форма их не получит, поскольку она отключена, пока отображается модальное диалоговое окно. Это происходит на системном уровне, поэтому сообщения мыши не будут отправляться в отключенные окна в вашем приложении (на самом деле моей первой идеей было использовать wxApp::FilterEvents(), но из-за этого он бесполезен для этой цели).

Одной из идей было бы использование метода CaptureMouse(), который можно использовать для направления всех событий мыши в окно, имеющее захват, даже когда курсор мыши находится за пределами своей области экрана, но над другими окнами приложения.

person mghie    schedule 04.11.2009
comment
К сожалению, он будет получать все события мыши, независимо от того, будут ли они переходить в другое окно того же приложения или в окно другого приложения. CaptureMouse() не блокирует переход кликов в другие приложения. При щелчке в другом приложении захват мыши теряется (и вы получаете сообщение об этом, которое вы ДОЛЖНЫ обработать, иначе wxWidgets утверждает.) - person Adam Vandenberg; 05.11.2009
comment
@Adam: Верно, так что это действительно стоит изучить. Я знаю о событии потери захвата, но не установил ментальную связь, я соответствующим образом отредактирую ответ. Спасибо за комментарий. - person mghie; 05.11.2009