C++ 包含窗口的自毁类

C++ 包含窗口的自毁类,c++,winapi,C++,Winapi,我创建了一个打印预览类PPREVIEW,其中包含一个打印预览窗口,该窗口应该在禁用应用程序的主窗口时弹出。当用户关闭预览窗口时,应该启用主窗口并销毁PPREVIEW对象。我想用以下方式使用它: PPREVIEW *p=new PPREVIEW; //next, preview window is created, user interaction begins p->ShowPreview(<parameters>); //but this function returns d

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

PPREVIEW *p=new PPREVIEW;
//next, preview window is created, user interaction begins
p->ShowPreview(<parameters>); //but this function returns
delete p;
PPREVIEW*p=新的PPREVIEW;
//接下来,创建预览窗口,开始用户交互
p->ShowPreview()//但是这个函数返回
删除p;
由于ShowPreview确实会返回,所以上面的行将在窗口仍然可见时销毁对象。若它是一个模态对话框,那个么这是可能的,因为DialogBox函数不会在那个点返回。 我想在打印预览窗口被破坏后,我可以把“删除这个”放在某个地方。自然,我想到了毁灭。但MSDN声明如下:“可以假设在WM_销毁子窗口的处理过程中仍然存在”,因此仍然有可能其中一些引用实例的变量(它们确实存在,我在尝试时遇到了随机访问冲突错误,所以我退出了)

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

但这是相当不公平的,并且要求我为每个使用打印预览的窗口编程这种行为,所以我决定采用前面的方法,即:创建、使用,可能是自删除。我需要:
-信息如果由于我不知道的原因,这种方法不是不明智的,我什么时候可以在PPREVIEW窗口过程中使用“删除此项”
-一个如何使ShowPreview方法不返回的想法,模拟对话框行为。
-实现我目标的其他建议


请提供帮助。

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

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

  • 您的
    ShowPreview
    函数应该调用
    ShowWindow()
    来显示预览窗口。它还应该对主窗体执行任何需要的操作,例如禁用它
  • <> LI>当你的预览窗口接收 WMyCalp时,它应该删除包装它的C++对象。此过程的某些部分还需要对基础窗口句柄调用
    destronWindow()
    。默认的处理<代码> WMyCalpHO/Obj>会这样做,但是也许您希望C++对象的析构函数中有这个。
    如果窗口是模态的,为什么ShowPreview会返回?另外,不要在这里使用
    new
    ,它根本不需要。我应该澄清:窗口不是模态的,它是由CreateWindowEx创建的,我只提到了DialogBox函数,因为我希望我的窗口也能这样做。@kiet:
    DialogBox
    不会因为它是模态的而返回。现在将尝试子消息循环。WM_DESTROY这件事——我一开始是这么做的,在关闭预览窗口很久之后,就发生了许多访问冲突,正如我在上面所写的。我花了好几个小时才将它们追溯到此。@Kitet子消息循环是对模式窗口所做的。但是您说您需要一个非模态窗口,它应该从主消息循环运行。您是否想要一个模态窗口?我现在不确定了。@DavidHeffernan:bdonlan显示的循环,虽然在某种意义上是模态的,但不会导致子窗口或父窗口的模态行为。对话框的模态消息循环在其包含树之外处理窗口的消息,而不调用窗口过程。@BenVoigt,不调用窗口过程如何处理消息,确切地说?@bdonlan:无论如何,我记得对话框模态循环有一些特殊之处。。。这是对
    IsDialogMessage
    的调用,您的循环缺少它。实际上,我想要的是自毁类或模态窗口。因为我更接近您的答案,所以我尝试了这个方法,而不是尝试另一个消息循环,并且它是有效的。在接受答案之前,我将测试几天。上次我在WM_中添加“删除此项”时,请销毁它,因为它会导致随机问题。现在,我想我准备好了。