VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 123|回复: 8

[已解决]非模态对话框资源如何释放,求助!!

[复制链接]
00_avatar_middle
最佳答案
1 
在线会员 发表于 2020-2-27 23:55:09 | 显示全部楼层 |阅读模式
10驿站币
今年把老大的教程基本都看完了,写了笔记,敲了好多文本文档,想给这些文本文档写一个搜索指定字符串的小工具

         · 创建非模态对话框
        CSearchDlg *pSearchDlg;
        pSearchDlg = new CSearchDlg();
        pSearchDlg->Create(IDD_SEARCH_DLG);
        pSearchDlg->ShowWindow(SW_SHOW);       

        在我销毁的时候就出问题了
         · 重载CSearchDlg 的PostNcDestroy

        void CSearchDlg::PostNcDestroy()
        {
        // TODO: 在此添加专用代码和/或调用基类
断点        MessageBox(TEXT("PostNcDestroy was called"));
        delete this;

        CDialog::PostNcDestroy();
       
        }

        刚开始是我不断的打开关闭弹出来的非模态对话框,发现任务管理器的内存数在增大
       
        然后我下了断点,结果在我关闭非模态对话框的时候 整个函数都没走
        而在整个主对话框退出的时候这个函数才走,弹出MessageBox
       
        这个问题以前我就遇到过,一直也没解决,我去百度谷歌,一退出非模态对话框程序就直接崩溃了非模态对话框资源如何释放,求助!!
最佳答案
20_avatar_small
2020-2-27 23:55:10
本帖最后由 VC6 于 2020-2-28 02:49 编辑
  1. // SearchDlg.h 头文件中
  2. #define MSG_DELETE_ME (WM_USER+1000) //自定义消息

  3. class CSearchDlg : public CDialog
  4. {
  5. public:
  6.         CSearchDlg(CWnd* pParent = NULL);   // standard constructor

  7.         ~CSearchDlg();//添加析构函数用于测试观察

  8.         PVOID m_pBuffer;//添加指针变量用于测试观察

  9.         HWND m_hWndMain;//主窗口句柄

  10.         virtual void OnCancel(); //重载CSearchDlg类的OnCancel()函数
复制代码

  1. CSearchDlg::CSearchDlg(CWnd* pParent /*=NULL*/)
  2.         : CDialog(CSearchDlg::IDD, pParent)
  3. {
  4.         OutputDebugString(_T("构造函数中申请一块内存"));
  5.         m_pBuffer = malloc(4096*4096);
  6. }

  7. CSearchDlg::~CSearchDlg()
  8. {
  9.         OutputDebugString(_T("析构函数释放这一块内存"));
  10.         if (m_pBuffer)
  11.         {
  12.                 free(m_pBuffer);
  13.                 m_pBuffer = NULL;
  14.         }       
  15. }

  16. void CSearchDlg::OnCancel()
  17. {
  18.         ::PostMessage(m_hWndMain, MSG_DELETE_ME, (WPARAM)this, 0);//给主窗口发送消息,通知主窗口删除资源
  19.         CDialog::OnCancel();
  20. }
复制代码


  1. //主窗口中的按钮事件
  2. void CMainDlgDlg::OnBtnSearch()
  3. {
  4.         CSearchDlg *pSearchDlg;//记得要包含SearchDlg.h头文件
  5.         pSearchDlg = new CSearchDlg;
  6.         pSearchDlg->Create(IDD_SEARCH_DLG);//创建
  7.         pSearchDlg->m_hWndMain = this->m_hWnd;//设置主窗口句柄
  8.     pSearchDlg->ShowWindow(SW_SHOW);   
  9. }

  10. //重载主窗口的PreTranslateMessage
  11. BOOL CMainDlgDlg::PreTranslateMessage(MSG* pMsg)
  12. {
  13.         if (pMsg->message == MSG_DELETE_ME)
  14.         {
  15.                 OutputDebugString(_T("接收到删除资源消息了"));
  16.                 CSearchDlg *pSearchDlg = (CSearchDlg *)pMsg->wParam;
  17.                 delete pSearchDlg;
  18.                 return TRUE;
  19.         }
  20.         return CDialog::PreTranslateMessage(pMsg);
  21. }
复制代码

最佳答案





上一篇:winHttp路径问题
下一篇:指针问题求助怎么简写
20_avatar_middle
最佳答案
4 
在线会员 发表于 2020-2-27 23:55:10 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 VC6 于 2020-2-28 02:49 编辑
  1. // SearchDlg.h 头文件中
  2. #define MSG_DELETE_ME (WM_USER+1000) //自定义消息

  3. class CSearchDlg : public CDialog
  4. {
  5. public:
  6.         CSearchDlg(CWnd* pParent = NULL);   // standard constructor

  7.         ~CSearchDlg();//添加析构函数用于测试观察

  8.         PVOID m_pBuffer;//添加指针变量用于测试观察

  9.         HWND m_hWndMain;//主窗口句柄

  10.         virtual void OnCancel(); //重载CSearchDlg类的OnCancel()函数
复制代码

  1. CSearchDlg::CSearchDlg(CWnd* pParent /*=NULL*/)
  2.         : CDialog(CSearchDlg::IDD, pParent)
  3. {
  4.         OutputDebugString(_T("构造函数中申请一块内存"));
  5.         m_pBuffer = malloc(4096*4096);
  6. }

  7. CSearchDlg::~CSearchDlg()
  8. {
  9.         OutputDebugString(_T("析构函数释放这一块内存"));
  10.         if (m_pBuffer)
  11.         {
  12.                 free(m_pBuffer);
  13.                 m_pBuffer = NULL;
  14.         }       
  15. }

  16. void CSearchDlg::OnCancel()
  17. {
  18.         ::PostMessage(m_hWndMain, MSG_DELETE_ME, (WPARAM)this, 0);//给主窗口发送消息,通知主窗口删除资源
  19.         CDialog::OnCancel();
  20. }
复制代码


  1. //主窗口中的按钮事件
  2. void CMainDlgDlg::OnBtnSearch()
  3. {
  4.         CSearchDlg *pSearchDlg;//记得要包含SearchDlg.h头文件
  5.         pSearchDlg = new CSearchDlg;
  6.         pSearchDlg->Create(IDD_SEARCH_DLG);//创建
  7.         pSearchDlg->m_hWndMain = this->m_hWnd;//设置主窗口句柄
  8.     pSearchDlg->ShowWindow(SW_SHOW);   
  9. }

  10. //重载主窗口的PreTranslateMessage
  11. BOOL CMainDlgDlg::PreTranslateMessage(MSG* pMsg)
  12. {
  13.         if (pMsg->message == MSG_DELETE_ME)
  14.         {
  15.                 OutputDebugString(_T("接收到删除资源消息了"));
  16.                 CSearchDlg *pSearchDlg = (CSearchDlg *)pMsg->wParam;
  17.                 delete pSearchDlg;
  18.                 return TRUE;
  19.         }
  20.         return CDialog::PreTranslateMessage(pMsg);
  21. }
复制代码

00_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-27 23:57:14 | 显示全部楼层
pSearchDlg->Create(IDD_SEARCH_DLG, this);  这句话原本是这样写的,也是白费。。。
75_avatar_middle
最佳答案
13 
online_supermod 发表于 2020-2-28 00:30:35 | 显示全部楼层
本帖最后由 wl1383838438 于 2020-2-28 00:33 编辑

  代码量不大的话 传上来吧 我帮你看看
00_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-28 10:40:00 | 显示全部楼层
wl1383838438 发表于 2020-2-28 00:30
代码量不大的话 传上来吧 我帮你看看

楼下大哥给解决了,谢谢嗷非模态对话框资源如何释放,求助!!
00_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-28 10:41:26 | 显示全部楼层

OK,解决了,谢谢大佬,有更简单的方法吗,这个稍微有点麻烦非模态对话框资源如何释放,求助!!
75_avatar_middle
最佳答案
13 
online_supermod 发表于 2020-2-28 11:35:16 | 显示全部楼层
tk3184020 发表于 2020-2-28 10:41
OK,解决了,谢谢大佬,有更简单的方法吗,这个稍微有点麻烦

你把代码  传上来,我把您看看有没有简单点的
20_avatar_middle
最佳答案
4 
在线会员 发表于 2020-2-28 13:01:25 | 显示全部楼层
tk3184020 发表于 2020-2-28 10:41
OK,解决了,谢谢大佬,有更简单的方法吗,这个稍微有点麻烦

最简单的就是定义全局的指针,只初始化创建一次,不用删除资源。
因为MFC的非模态对话框点击关闭后,并没有真正的销毁,只是隐藏了而已,下次直接ShowWindow(SW_SHOW)就可以显示出来。
  1. //定义全局变量
  2. CSearchDlg *g_pSearchDlg;//记得要包含SearchDlg.h头文件

  3. //主窗口中的按钮事件
  4. void CMainDlgDlg::OnBtnSearch()
  5. {
  6.     if (g_pSearchDlg == NULL)
  7.     {
  8.         g_pSearchDlg = new CSearchDlg;//只new 一次
  9.         g_pSearchDlg->Create(IDD_SEARCH_DLG);//只创建一次
  10.     }  
  11.     g_pSearchDlg->ShowWindow(SW_SHOW);//显示非模态窗口
  12. }
复制代码

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

00_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-28 22:18:32 | 显示全部楼层
VC6 发表于 2020-2-28 13:01
最简单的就是定义全局的指针,只初始化创建一次,不用删除资源。
因为MFC的非模态对话框点击关闭后,并 ...

OKOK,完美解决 谢谢非模态对话框资源如何释放,求助!!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-4-8 07:02

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表