读书人

请教怎么正确销毁非模式对话框

发布时间: 2012-01-19 20:57:58 作者: rapoo

请问如何正确销毁非模式对话框?
我建立的是基于对话框的工程,其中一个按钮,对应OnWatch函数,点击按钮进入函数。我需要两次进入OnWatch,第一次进入时,创建一个非模式对话框,第二次进行销毁,请问我该怎么做,在哪里创建这个非模式对话框。
在CEEGTestDlg.h中添加 CPicDlg *m_dlg;
而后在OnWatch函数中
void CEEGTestDlg::OnWatch()
{
if(!gm_bWatch)
{
……
m_dlg= new CPicDlg();//这里
if(m_dlg!=NULL)
{
bool ret = m_dlg-> Create(IDD_PIC,NULL);
if(!ret) //Create failed.
AfxMessageBox( "Error creating Dialog ");
}
m_dlg-> ShowWindow(SW_SHOW);
……
gm_pThread=AfxBeginThread(&Thread_IO_InData,this);
}
else if(gm_bWatch)
{
gm_bWatch=FALSE;
m_dlg-> ShowWindow(SW_HIDE);
m_dlg-> DestroyWindow();
…….
}
这样感觉第二次进入又创建了一个新的对话框,请问我该把这个创建和销毁放在什么地方才能达到我的目的啊,多谢了!


[解决办法]
你不是靠 gm_bWatch 来控制了么?怎么会2次呢
[解决办法]
这个你应该在析够函数中处理gm_bWatch(如果gm_bWatch是成员变量的话),在里面直接delete []gm_bWatch一下就行了.要是按你上面说的话,设置一个标志位,下次进入时判断一下就行了
[解决办法]
destroyWindow()

[解决办法]
#include SAFE_RELEASE(p) \
if( p ) \
{ \
p-> DestroyWindow(); \
delete p; \
p = NULL; \
}

CPicDlg* m_pDlg; // member object pointer

// Initialize the object pointer
m_pDlg = NULL;

// Create and show the dialog
SAFE_RELEASE(m_pDlg);

m_pDlg-> Create(...)
m_pDlg-> ShowWindow(SW_SHOWNORMAL);
[解决办法]
To testeeg():
你和eegtest()是同一个人吗?
你的这段代码,如果m_pDlg是自己点X关闭的,那么关闭后,m_pDlg = NULL并没有执行到,所以下次点按钮开启的时候,判断m_pDlg==NULL为false,也就是对话框无法弹出。
所以正确的做法,还是应该是http://community.csdn.net/Expert/topic/5392/5392619.xml?temp=.4718286此帖所提到的方法。

[解决办法]
另外注意一点,非模态的对话框当你关闭时,并非是事实上的销毁了
不像模态的,
要调用另一个函数销毁.

读书人网 >VC/MFC

热点推荐