包含窗口的自毁类

时间:2011-10-02 15:44:31

标签: c++ winapi

我创建了一个打印预览类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窗口程序中使用“删除此”的信息,如果这种方法由于某种原因我不知道是不明智的 - 了解如何使ShowPreview方法不返回,模仿DialogBox行为 - 实现我的目标的其他建议

请协助。

2 个答案:

答案 0 :(得分:2)

  1. 您的ShowPreview函数应调用ShowWindow()以显示预览窗口。它还应该做主要形式所需的任何事情,例如:禁用它。
  2. 当预览窗口收到WM_CLOSE时,它应该删除包装它的C ++对象。此过程的某些部分还需要在基础窗口句柄上调用DestroyWindow()WM_CLOSE的默认处理会执行此操作,但您可能希望在C ++对象的析构函数中使用它。

答案 1 :(得分:0)

如果您希望ShowPreview是模态的,则需要运行子消息循环。您可以找到some examples here,包括DialogBox内部使用的反向工程版本。

或者,您只需让预览窗口的WM_DESTROY重新启用主窗口并删除PPREVIEW *(在这种情况下ShowPreview不会是模态的,但是它将是独立的)。在PPREVIEW *调用之后,您必须小心不要触摸PPREVIEW(或者,来自DestroyWindow()的成员函数,而不是调用任何其他成员或访问任何成员变量)虽然 - 这尤其意味着您无法在DefWindowProc()调用

之后访问消息处理程序中的成员变量