一般c++ 是谁new ,谁delete 。当然有特殊的,比如:mfc中。 销毁非模式对话框 ,就是特使的, 微软说的标准的做法是在void CADialog::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy(); delete this; //多加的一句,调用析构
}很明显 微软不遵循c++ 语法标准。我为了让谁new , 谁delete ,
大家帮忙看看,我的以下 做法有没有什么缺陷, 有的话,帮忙纠正一下,谢谢了啊。下面是 代码.................................对话框上 已经去掉 确定 和取消 两个按钮了。void CADialog::OnClose()
{
// TODO: Add your message handler code here and/or call default
//CDialog::OnClose();
DestroyWindow();
}void CADialog::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy(); ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DIALOG_DESTROY,CADialog::IDD,0); //发送销毁对话框的消息给付窗口
}
而在 主框架中:
////////////////////////////////////////
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
pdlg=NULL;
}
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here if(pdlg==NULL) //没创建,则创建之
{
pdlg=new CADialog(this);
pdlg->Create(IDD_DIALOG1,this);
}
pdlg->ShowWindow(SW_SHOW);
}
//处理对话框等窗口发给主框架的自定义消息
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{ if( wParam==CADialog::IDD && lParam==0)
{
delete pdlg; //销毁对话框
pdlg=NULL;
} return 0;
}这样 就实现了 ,点击右上角,对话框释放掉,然后点击菜单再次创建的功能了。。程序运行后,没任何问题, 不知道有没有潜在的问题,有的话,请指出。
第二个问题:网上侯捷的部分章节提到:在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环 可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。
也就是说,侯捷指出,对于窗口来讲,没有所谓的PostNcDestroy啊??? 这是为什么???
谢谢大家了。。 帮忙解答一下
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy(); delete this; //多加的一句,调用析构
}很明显 微软不遵循c++ 语法标准。我为了让谁new , 谁delete ,
大家帮忙看看,我的以下 做法有没有什么缺陷, 有的话,帮忙纠正一下,谢谢了啊。下面是 代码.................................对话框上 已经去掉 确定 和取消 两个按钮了。void CADialog::OnClose()
{
// TODO: Add your message handler code here and/or call default
//CDialog::OnClose();
DestroyWindow();
}void CADialog::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy(); ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DIALOG_DESTROY,CADialog::IDD,0); //发送销毁对话框的消息给付窗口
}
而在 主框架中:
////////////////////////////////////////
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
pdlg=NULL;
}
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here if(pdlg==NULL) //没创建,则创建之
{
pdlg=new CADialog(this);
pdlg->Create(IDD_DIALOG1,this);
}
pdlg->ShowWindow(SW_SHOW);
}
//处理对话框等窗口发给主框架的自定义消息
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{ if( wParam==CADialog::IDD && lParam==0)
{
delete pdlg; //销毁对话框
pdlg=NULL;
} return 0;
}这样 就实现了 ,点击右上角,对话框释放掉,然后点击菜单再次创建的功能了。。程序运行后,没任何问题, 不知道有没有潜在的问题,有的话,请指出。
第二个问题:网上侯捷的部分章节提到:在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环 可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。
也就是说,侯捷指出,对于窗口来讲,没有所谓的PostNcDestroy啊??? 这是为什么???
谢谢大家了。。 帮忙解答一下
解决方案 »
- 相当有挑战性:能否取得当前浏览页面的html源代码?
- 模态对话框
- 关于文件读取速度问题?
- 关于释放进程的问题!( fanqing(火影忍者+26%)再请你来看一下)
- 关于SDI窗口最大化的问题,请指点
- 用ATL写ASP组件,如何通过ASP将一个BYTE类型的变量传递给组件?
- 请各位朋友帮我解决一下!一段代码,及出现的错误提示,“\”是做什么用的?
- 失望!!!如此简单的问题竟然没人可以搞定?????
- 连接ftp服务器下载文件夹的问题??
- 如何在程序中控制Volume Control和Recording Control的一些设置
- 为什么消息总是接受2次.
- RickEdit控件 添加NM_CLICK消息 无法响应
OnNcDestroy是由非客户区销毁触发的
Called by the default OnNcDestroy member function after the window has been destroyed.
{
// TODO: Add your specialized code here and/or call the base classCDialog::PostNcDestroy();::SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DIALOG_DESTROY,CADialog::IDD,0); //发送销毁对话框的消息给付窗口
}
我在这里 发送自定义的消息给主框架,让主框架去销毁它new出来的对话框, 就没事了吧
我看了不少文章, 该死的mfc封装太厉害了。。好些文章都说PostNCDestroy 是销毁对话框的最后一个函数。。
、
所以在这里来 发送 同步消息 给主框架销毁, 就不会不会造成什么 资源没有释放了
谁New谁就Delete,这只是建议的做法,不过一般都会遵循这样的方法.
像strdup这个c函数,也是只malloc了,没free,要自己free。这个函数的作用就是复制一个字符串。
char *strdup(
const char *strSource
);
#include <string.h> char *strdup(const char *s); #define _GNU_SOURCE
#include <string.h> char *strndup(const char *s, size_t n);
char *strdupa(const char *s);
char *strndupa(const char *s, size_t n);DESCRIPTION
The strdup() function returns a pointer to a new string which is a
duplicate of the string s. Memory for the new string is obtained
with malloc(3), and can be freed with free(3).
OnNcDestroy是由非客户区销毁触发的