我创建了一个打印预览类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行为
- 实现我的目标的其他建议
请协助。
答案 0 :(得分:2)
ShowPreview
函数应调用ShowWindow()
以显示预览窗口。它还应该做主要形式所需的任何事情,例如:禁用它。WM_CLOSE
时,它应该删除包装它的C ++对象。此过程的某些部分还需要在基础窗口句柄上调用DestroyWindow()
。 WM_CLOSE
的默认处理会执行此操作,但您可能希望在C ++对象的析构函数中使用它。答案 1 :(得分:0)
如果您希望ShowPreview
是模态的,则需要运行子消息循环。您可以找到some examples here,包括DialogBox
内部使用的反向工程版本。
或者,您只需让预览窗口的WM_DESTROY
重新启用主窗口并删除PPREVIEW *
(在这种情况下ShowPreview
不会是模态的,但是它将是独立的)。在PPREVIEW *
调用之后,您必须小心不要触摸PPREVIEW
(或者,来自DestroyWindow()
的成员函数,而不是调用任何其他成员或访问任何成员变量)虽然 - 这尤其意味着您无法在DefWindowProc()
调用