模态非模态窗口的创建及销毁

前几天发现自己的程序中使用非模态对话框,Debug版本有警告提示如下:

    Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called

    由于是Warnning,就没有太在意,后来随意上网一找发现,这个问题还是很严重的问题。

    先说下模式对话框调用的原则。(就是一定要先关了这个对话框才能操作后面窗口的对话框)

    在模式对话框下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()关闭对话框。

    一定要注意之前的CDialog::(当然,你可以重载你自己对话框的这个虚函数,但是,后面必须调用基类的CDialog::)

    具体我们再参照深入浅出的风格,来个解刨。

    CDialog::Close()默认调用CDialog::OnCancel() , CDialog::OnCancel()调用CDialog::EndDialog(IDCANCEL);

    CDialog::EndDialog调用CDialog::Destroywindows(),CDialog::DestroyWindows调用CDialog::OnDestroy() ;

    CDialog::OnOK()默认先CDialog::UpdateData(),然后再调用CDialog::EndDialog(IDOK).

    CDialog::EndDialog调用CDialog::DestroyWindows(), CDialog::DestroyWindows调用CDialog::OnDestroy()

    看来上面你可能就知道了如下的等式

    CDialog::Close() == CDialog::OnCancel() == CDialog::EndDialog(IDCANCEL)一样。

    CDialog::OnOK() == CDialog::EndDialog(IDOK).

    而CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的区别就是,少了一个CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在关闭对话框后,会把对话框上控件关联的变量的值更新为用户最后输入的值,即:UpdateData(FALSE).而CDialog::EndDialog(IDCANCEL)就不会更新这个值。

 

    下面说说非模态对话框(涉及到窗口销毁及指针对象的销毁)。

    调用原则是:

    在无模式对话框,重载你自己的OnOK(),就是CMyDialog::OnOK()调用CDialog::DestroyWindows()。注意:不是默认的CDialog::OnOK()来关闭对话框。

    重载CMyDialog::OnCancel()调用CDialog::DestroyWindows()。注意:不是调用默认的CDialog::OnCancel(),来关闭对话框。

    听起来很简单,但是下面提到一个很具体的编程问题。

    一般,我们用非模态对话框都是全局的,也就是通过new来创建,是在heap上的,而不是在stack上的。

    这样我们当然还要通过delete 来销毁对象,不然可是有内存泄漏的。那么我们什么时候delete这个对象呢?

    在msdn上面我们可以看到微软提供的方法是,

    我们要重载PostNcDestroy(),即我们要实现CMyDialog::PostNcDestroy(),内容如下

    CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }

    这样的话,我们的类就会Auto-Cleanup了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wxPython是一个基于Python的GUI开发工具包,它提供了丰富的界面组件和功能,可以用于创建跨平台的桌面应用程序。模态窗口是wxPython中的一种特殊类型的窗口,它与其他窗口之间存在一种父子关系,并且在模态窗口打开期间,用户无法与其他窗口进行交互。 在wxPython中创建模态窗口可以通过以下步骤实现: 1. 创建一个继承自wx.Dialog的子类,作为模态窗口的定义。 2. 在子类的构造函数中设置窗口的样式为wx.DEFAULT_DIALOG_STYLE | wx.STAY_ON_TOP,以及父窗口对象。 3. 在子类中添加需要的界面组件和功能。 4. 在父窗口中调用子类的ShowModal()方法来显示模态窗口。 下面是一个简单的示例代码,演示了如何创建一个模态窗口: ```python import wx class MyDialog(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent, title="Modal Dialog", style=wx.DEFAULT_DIALOG_STYLE | wx.STAY_ON_TOP) # 添加界面组件 self.panel = wx.Panel(self) self.text = wx.StaticText(self.panel, label="This is a modal dialog.", pos=(20, 20)) self.button = wx.Button(self.panel, label="OK", pos=(20, 50)) # 绑定按钮事件 self.button.Bind(wx.EVT_BUTTON, self.onButtonClicked) def onButtonClicked(self, event): self.EndModal(wx.ID_OK) # 关闭模态窗口 class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Main Frame") # 添加按钮 self.panel = wx.Panel(self) self.button = wx.Button(self.panel, label="Open Modal Dialog", pos=(20, 20)) # 绑定按钮事件 self.button.Bind(wx.EVT_BUTTON, self.onButtonClicked) def onButtonClicked(self, event): dialog = MyDialog(self) # 创建模态窗口对象 result = dialog.ShowModal() # 显示模态窗口 if result == wx.ID_OK: print("Modal dialog closed.") dialog.Destroy() # 销毁模态窗口 app = wx.App() frame = MyFrame() frame.Show() app.MainLoop() ``` 在上面的示例中,我们创建了一个主窗口MyFrame和一个模态窗口MyDialog。当点击主窗口上的按钮时,会打开模态窗口,用户只能与模态窗口进行交互,直到关闭模态窗口为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值