包含窗口的自毁类
Self-destructing class containing a window
我创建了一个打印预览类,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方法不返回,模仿对话框的行为。-其他达到我目标的建议
请协助。
- 你的
ShowPreview
函数应该调用ShowWindow()
来显示预览窗口。它还应该做任何需要主表单,例如禁用它。 - 当你的预览窗口收到
WM_CLOSE
,它应该删除包装它的c++对象。这个进程的某些部分还需要调用底层窗口句柄上的DestroyWindow()
。WM_CLOSE
的默认处理会这样做,但也许你希望在c++对象的析构函数中这样做。
如果您希望ShowPreview
是模态的,则需要运行子消息循环。您可以在这里找到一些示例,包括DialogBox
内部使用的反向工程版本。
或者,您可以简单地让预览窗口的WM_DESTROY
重新启用主窗口并删除PPREVIEW *
(在这种情况下,ShowPreview
将不是模态的,但它将是自包含的)。在DestroyWindow()
调用之后,您必须小心不要触及PPREVIEW *
(或者,从PPREVIEW
的成员函数中,不要调用任何其他成员或访问任何成员变量)-这特别意味着您不能在DefWindowProc()
调用之后访问消息处理程序中的成员变量
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 问:如何使用C++中的按钮从窗口打开窗口
- 在包含窗口标头时难以解决循环依赖关系问题
- Visual Studio 2019 不会打开包含源文件的窗口,也不会定位为出现错误的行
- Visual Studio 的内存窗口仅包含问号
- gtkmm - 如何使包含小部件的框展开以填充窗口
- QTCreator GUI应用程序中包含窗口基源代码并在代码中打开
- Qt 窗口包含提升线程标头失败
- CMake "make install"或在窗口中包含库
- 创建一个包含矩形的窗口,其中包含一个带有 C++ 和 SDL2 的矩形
- WinAPI窗口中包含的OpenGL/GLUT视图
- 无法为窗口生成包含C++库的R包
- 包含窗口的自毁类
- C++ 编译窗口包含垃圾字符