包含窗口的自毁类

Self-destructing class containing a window

本文关键字:窗口 包含      更新时间:2023-10-16

我创建了一个打印预览类,PPREVIEW,包含一个打印预览窗口,它应该在我的应用程序的主窗口弹出,而禁用它。当用户关闭预览窗口时,应该启用主窗口并销毁PPREVIEW对象。我想这样使用它:

PPREVIEW *p=new PPREVIEW;
//next, preview window is created, user interaction begins
p->ShowPreview(<parameters>); //but this function returns
delete p;

由于ShowPreview确实返回,上面的行将在窗口仍然可见时销毁对象。如果它是一个模态对话框,这是可能的,因为DialogBox函数在那时不会返回。我想我可以把"删除这个"的地方破坏打印预览窗口。WM_DESTROY自然会出现在我的脑海中。但是MSDN在http://msdn.microsoft.com/en-us/library/windows/desktop/ms632620%28v=vs.85%29.aspx的状态如下:"可以假设,在处理WM_DESTROY子窗口仍然存在",所以仍然有可能他们中的一些人会引用实例的变量(他们这样做,当我尝试时,我得到随机访问违反错误,所以我退出了)。

目前我选择:
-创建一些全局变量,
-在WM_DESTROY的打印预览窗口,我把EnableWindow(MainWindow, TRUE),并设置全局变量为FALSE。
-然后,在主窗口的WM_ENABLE事件上,我正在测试全局变量是否为FALSE并删除对象。

但是这是相当不优雅的,并且要求我为每个使用打印预览的窗口编程这个行为,所以我决定采用之前的方法,即:创建,使用,可能是自删除。我需要:
什么时候我可以在PPREVIEW窗口过程中使用"delete this",如果这种方法不是不明智的,我不知道
-一个想法如何使ShowPreview方法不返回,模仿对话框的行为。-其他达到我目标的建议

请协助。

  1. 你的ShowPreview函数应该调用ShowWindow()来显示预览窗口。它还应该做任何需要主表单,例如禁用它。
  2. 当你的预览窗口收到WM_CLOSE,它应该删除包装它的c++对象。这个进程的某些部分还需要调用底层窗口句柄上的DestroyWindow()WM_CLOSE的默认处理会这样做,但也许你希望在c++对象的析构函数中这样做。

如果您希望ShowPreview是模态的,则需要运行子消息循环。您可以在这里找到一些示例,包括DialogBox内部使用的反向工程版本。

或者,您可以简单地让预览窗口的WM_DESTROY重新启用主窗口并删除PPREVIEW *(在这种情况下,ShowPreview将不是模态的,但它将是自包含的)。在DestroyWindow()调用之后,您必须小心不要触及PPREVIEW *(或者,从PPREVIEW的成员函数中,不要调用任何其他成员或访问任何成员变量)-这特别意味着您不能在DefWindowProc()调用之后访问消息处理程序中的成员变量