是否有可能使wxFrame对象的行为类似于模式对话框,即创建wxFrame对象的窗口将停止执行直到wxFrame对象退出?

我正在研究small game并遇到以下问题。我有一个承载主应用程序(策略部分)的主程序窗口。有时,我需要将控制权转移到第二个窗口,以解决游戏部分(战术部分)的问题。在第二个窗口中时,我希望第一个窗口中的处理停止并等待第二个窗口中完成的工作。

通常,模态对话框可以解决问题,但我希望新窗口具有wxDialog似乎无法提供的某些功能,即底部的状态栏以及能够调整/最大化/最小化窗口的功能(此功能应该是可能的,但不起作用,请参阅此问题How to get the minimize and maximize buttons to appear on a wxDialog object)。

另外,我希望第二个窗口的功能需要与主窗口保持完全脱钩,因为它将最终分解为一个单独的程序。

有没有人这样做或有任何建议?

最佳答案

我也在寻找类似的解决方案,并提出了这个解决方案,创建一个框架,通过执行frame.MakeModal()禁用其他窗口,并在显示框架后停止执行开始和事件循环,并在关闭框架时退出事件循环,例如我这里是使用wxpython的示例,但在wxwidgets中应该类似。

import wx

class ModalFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, style=wx.DEFAULT_FRAME_STYLE|wx.STAY_ON_TOP)

        btn = wx.Button(self, label="Close me")
        btn.Bind(wx.EVT_BUTTON, self.onClose)
        self.Bind(wx.EVT_CLOSE, self.onClose) # (Allows main window close to work)

    def onClose(self, event):
        self.MakeModal(False) # (Re-enables parent window)
        self.eventLoop.Exit()
        self.Destroy() # (Closes window without recursion errors)

    def ShowModal(self):
        self.MakeModal(True) # (Explicit call to MakeModal)
        self.Show()

        # now to stop execution start a event loop
        self.eventLoop = wx.EventLoop()
        self.eventLoop.Run()


app = wx.PySimpleApp()
frame = wx.Frame(None, title="Test Modal Frame")
btn = wx.Button(frame, label="Open modal frame")

def onclick(event):
    modalFrame = ModalFrame(frame, "Modal Frame")
    modalFrame.ShowModal()
    print "i will get printed after modal close"

btn.Bind(wx.EVT_BUTTON, onclick)

frame.Show()
app.SetTopWindow(frame)
app.MainLoop()

关于c++ - 如何使wxFrame表现得像模态wxDialog对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/883498/

10-10 21:23