c++ - 如何通过wxWidgets中的`wxWindow::PopupMenu`以编程方式关闭用作弹出菜单的wxMenu?
问题描述
我有一组绘图视图实例,它们根据来自另一个进程的 tcp 端口的传入信号动态添加/删除。
在每种情况下,用户都可以右键单击打开一个弹出菜单,通过 调用wxWindow::PopupMenu
。
如果要在弹出菜单可见时动态关闭绘图视图实例,则在弹出菜单仍处于浮动状态时关闭视图实例窗口。然后任何 GUI 操作都会使应用程序崩溃。
我一直在浏览 wxWidgets 的 API,以找到一种以编程方式关闭绘图视图析构函数中的弹出菜单的方法,但没有运气。
我发现这个论坛帖子表明以编程方式关闭弹出菜单是不可能的。但它太旧了,所以不确定它是否仍然是有效的假设。
以下是迄今为止失败的试验:
- 试图在绘图视图上调用
SetFocus
和SetFocusFromKbd
作为移动焦点的一种方式。 - 生成鼠标左键单击事件并将其发送到弹出菜单。
生成键盘事件并将其发送到弹出菜单。
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
编辑#1
注意:对于建议升级 wxWidgets 版本的评论者和答案,这是我团队每天都在争论的问题。但答案仍然是否定的。
大多数试验都失败了。但我找到了一种解决方法来停止崩溃,但弹出菜单不会关闭。
解决方案是使用他们的设置器使以下成员无效,因此菜单回调不会访问它们。
this->GetPopupMenu()->SetInvokingWindow(NULL);
this->GetPopupMenu()->SetEventHandler(NULL);
解决方案
最好的可能是延迟破坏底层窗口直到PopupMenu()
返回。实际上,您的程序逻辑非常复杂,因为您正在调度导致从内部PopupMenu()
函数关闭窗口的事件,即使您可以wxUIActionSimulator
用来关闭菜单,这也不能很好地结束(但您绝对应该在任何情况下都考虑升级你 15 岁的 wxWidgets 版本)。
推荐阅读
- c# - 索引(ElasticClient.IndexMany())抛出 StackOverflowException
- python - 在 ManyToManyField 中计算喜欢 - django rest 框架
- postgis - 通过外部 Geoserver 连接到本地 PC 中的 postgis 数据库
- android - 为什么更新不存在的 firestore 文档永远不会失败?
- php - 为什么流明不能识别正在发送的字段
- php - 如果列不为空,则更新记录,否则在 laravel 中创建新记录
- swift - SwiftUI MacOS - 设置 NSToolbar 颜色
- android - 如何传递继承Kotlin中另一个类的不同类的可变参数?
- java - 如何使用 OpenCV 检测停车标志?
- javascript - 在 Angular 项目中导入 2 个同名的 JavaScript 函数