Как программно закрыть wxMenu, используемое в качестве всплывающего меню, через `wxWindow :: PopupMenu` в wxWidgets? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть набор экземпляров графического представления, которое динамически добавляется / удаляется в соответствии с входящими сигналами от порта tcp от другого процесса.

В каждом случае пользователь может щелкнуть правой кнопкой мыши, чтобы открыть всплывающее меню, вызываемоечерез wxWindow::PopupMenu.

Если экземпляр графического представления должен динамически отключаться, пока отображается всплывающее меню, окно экземпляра представления закрывается, пока всплывающее меню все еще находится в плавающем состоянии.Затем любое действие с графическим интерфейсом приводит к сбою приложения.

Я просматривал API для wxWidgets, чтобы найти способ программно закрыть всплывающее меню в деструкторе графического представления, но безуспешно.

Я нашел этот форум post , предлагающий невозможное закрыть всплывающее меню программным способом.Но он слишком старый, поэтому не уверен, что это все еще допустимое предположение.


Вот испытания, которые не были выполнены до сих пор:

  1. Попытка вызвать SetFocus и SetFocusFromKbd в графическом представлении как способ перемещения фокуса.
  2. Создание события щелчка левой кнопкой мыши и отправка его во всплывающее меню.
  3. Создание события клавиатуры и отправка его во всплывающее окно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);

1 Ответ

0 голосов
/ 05 февраля 2019

Лучше всего отложить уничтожение базового окна до тех пор, пока не вернется PopupMenu().Таким образом, логика вашей программы очень запутанная, потому что вы отправляете событие, которое приводит к закрытию окна изнутри функции PopupMenu(), и это просто не может хорошо закончиться, даже если вы можете использовать wxUIActionSimulator для закрытияменю (но в любом случае вам обязательно следует обновить свою 15-летнюю версию wxWidgets).

...