У меня есть набор экземпляров графического представления, которое динамически добавляется / удаляется в соответствии с входящими сигналами от порта tcp от другого процесса.
В каждом случае пользователь может щелкнуть правой кнопкой мыши, чтобы открыть всплывающее меню, вызываемоечерез wxWindow::PopupMenu
.
Если экземпляр графического представления должен динамически отключаться, пока отображается всплывающее меню, окно экземпляра представления закрывается, пока всплывающее меню все еще находится в плавающем состоянии.Затем любое действие с графическим интерфейсом приводит к сбою приложения.
Я просматривал API для wxWidgets, чтобы найти способ программно закрыть всплывающее меню в деструкторе графического представления, но безуспешно.
Я нашел этот форум post , предлагающий невозможное закрыть всплывающее меню программным способом.Но он слишком старый, поэтому не уверен, что это все еще допустимое предположение.
Вот испытания, которые не были выполнены до сих пор:
- Попытка вызвать
SetFocus
и SetFocusFromKbd
в графическом представлении как способ перемещения фокуса. - Создание события щелчка левой кнопкой мыши и отправка его во всплывающее меню.
Создание события клавиатуры и отправка его во всплывающее окноmenu.
PlottingView::~PlottingView()
{
cout << "Sending wxMouseEvent to the popup menu" << endl;
wxMouseEvent e(wxEVT_LEFT_UP);
this->GetPopupMenu()->ProcessEvent(e);
wxKeyEvent ke(wxEVT_CHAR);
ke.m_keyCode = WXK_DOWN;
this->GetPopupMenu()->ProcessEvent(ke);
ke.m_keyCode = WXK_RETURN;
this->GetPopupMenu()->ProcessEvent(ke);
// the rest of the destruction
}
Поэтому я буду признателен за любую идею программно закрыть это всплывающее меню.
Платформа:
CentOS: 6.7
wxWidgets 2.8.12
G ++: 4.3.3
Edit # 1
Примечание. Для комментаторов и ответов, предлагающих обновить версию wxWidgets, в моей команде каждый день идут дебаты,Но ответ все еще нет.
Большинство испытаний не удалось.Но я нашел обходной путь, чтобы остановить сбой, но всплывающее меню не закрывалось.
Решением было аннулировать следующие члены, используя их установщики, поэтому обратный вызов меню не сможет получить к ним доступ.
this->GetPopupMenu()->SetInvokingWindow(NULL);
this->GetPopupMenu()->SetEventHandler(NULL);