【发布时间】:2012-11-29 14:35:35
【问题描述】:
我想创建在关闭时不会被销毁的 wxFrame,所以我可以稍后将它们显示回来,并且即使它们被隐藏也可以继续更新它们。
我尝试使用SetExtraStyle(wxWS_EX_BLOCK_EVENTS) 跳跃,因为它不会将 wxCloseEvent 传播给曾经破坏它的人,但它没有帮助。
我找到了以下解决方案。我必须创建一个处理程序来处理关闭事件并隐藏框架。在这种情况下,事件不会被进一步传播。 但这有点重,因为我需要跟踪处理程序并自己删除它。
有人有更聪明的解决方案吗?
class FrameCloseHider
: public wxEvtHandler
{
public:
explicit FrameCloseHider(wxTopLevelWindow*);
void internalOnQuit(wxCloseEvent&);
wxTopLevelWindow* getFrame();
private:
wxTopLevelWindow* frame_;
};
wxTopLevelWindow* FrameCloseHider::getFrame()
{
return this->frame_;
}
void FrameCloseHider::internalOnQuit(wxCloseEvent& obj)
{
this->frame_->Hide();
}
FrameCloseHider::FrameCloseHider(wxTopLevelWindow* frame)
:frame_(frame)
{
this->frame_->Connect(
frame_->GetId(),
wxEVT_CLOSE_WINDOW,
wxCloseEventHandler(FrameCloseHider::internalOnQuit),
NULL,
this);
}
【问题讨论】:
-
您确定要保留窗口,而不是将要继续更新的特定数据分离到另一个类中吗? (就像文档/视图分离...) 让操作系统窗口保持在周围但不可见是一种奇怪的优化,您在程序中执行的此类操作越多,它就越令人困惑。
-
为什么不能从 wxFrame 派生并将事件处理程序放在派生类中?
-
@Pete:我认为继承添加这样的功能没有意义,因为我可能希望拥有很多不同的功能并为它们中的每一个继承......根本不可能。
-
@HostileFork:你有关于这个文档/视图分离的好的文档吗?也许停止更新是一种优化,但销毁窗口并创建一个新窗口有点复杂。我正在开发的应用程序是多线程的,并且在 UI 线程和生成数据的其他线程中进行初始化很痛苦。
-
我看不出它会如何改变任何东西,因为除了在几乎大多数操作系统上创建 GUI 的线程之外,你真的不应该从任何东西进行 GUI 调用。我想这适用于显示和隐藏(尽管它是否会崩溃或挂起或导致不良行为可能取决于具体情况)。您应该寻找工作人员/GUI 分离的良好示例,工作人员可以将请求排队到 GUI 管道。 Qt 有一个great cross-thread messaging system,所以一定要考虑切换...! :-)