【发布时间】:2011-10-02 15:44:31
【问题描述】:
我创建了一个打印预览类 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 行为的想法。
- 实现我目标的其他建议
请帮忙。
【问题讨论】:
-
如果窗口是模态的,为什么 ShowPreview 返回?另外,这里不要使用
new,根本不需要。 -
我应该澄清一下:窗口不是模态的,它是由 CreateWindowEx 创建的,我只提到了 DialogBox 函数,因为我希望我的窗口也能这样。
-
@Kitet:
DialogBox不会仅仅因为它是模态的而返回。