wxWidgets - блокирование модальных диалоговых окон в OS X - PullRequest
0 голосов
/ 11 мая 2018

Сейчас я работаю над переносом моего старого приложения (созданного в wxWidgets 3.0.2 и предназначенного для Windows) на macOS. Мое приложение является редактором кода, и при закрытии приложения я хотел спросить, хочет ли пользователь сохранить.

switch (dialog->ShowModal())
{
    case wxID_YES:
        OnMenuSave(e);

        // Only break if the file is not saved
        // The user must have clicked on cancel button in save as box
        if (!editorPage->CodeChanged())
            break;

    case wxID_CANCEL:
        e.Veto();
        dialog->Destroy();
        return;
}

Раньше это работало нормально, но, тем не менее, я хотел показать диалоги в стиле mac, как будто они были прикреплены к окну, из которого они созданы.

Поэтому, когда я написал вспомогательную функцию для использования функции ShowWindowModalThenDo в диалоговом окне.

template <typename Functor>
inline void ShowWindowModalThenDo(wxDialog *dlg, const Functor& onEndModal)
{
#ifdef __WXMAC__
    dlg->ShowWindowModalThenDo(onEndModal);
#else
    onEndModal(dlg->ShowModal());
#endif
}

Проблема в том, что он не приостанавливает событие, пока отображается диалоговое окно. Это особенно проблематично, поскольку я обращаюсь с этим в событии закрытия редактора. Таким образом, даже когда диалоговое окно отображается и позволяет пользователю нажать кнопку «Отмена», страница редактора закрывается.

Как временно приостановить обработку событий в родительском окне?

1 Ответ

0 голосов
/ 11 мая 2018

Если вы просто хотите отобразить модальное диалоговое окно в виде листа, вам не нужно использовать ShowWindowModalThenDo(), просто убедитесь, что в вашем диалоговом окне есть окно, которое следует использовать в качестве родительского элемента листа в качестве родительского.

...