VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 357|回复: 8

[已解决]CDC画线资源释放问题

[复制链接]
71_avatar_middle
最佳答案
0 
在线会员 发表于 2020-12-25 15:57:18 | 显示全部楼层 |阅读模式
各位大侠,我现在遇到以下困惑,请求帮助。
我编了一个实施曲线的小程序,用于实时显示数据曲线,其中共四天曲线,分为不同的颜色,开始运行时显示都很正常,运行一段时间以后,曲线的样式和颜色都没有了,变成了黑色,但是程序还在运行,我猜是资源释放的问题,但是一直也没找到问题所在,求大侠帮忙。
  1. void CHuaTuStatic::OnPaint()
  2. {
  3.         CPaintDC dc(this); // device context for painting
  4.                                            // TODO: 在此处添加消息处理程序代码
  5.                                            // 不为绘图消息调用 CStatic::OnPaint()
  6.         CDC m_dc;
  7.         CRect rect;
  8.         GetClientRect(rect);
  9.         m_dc.CreateCompatibleDC(&dc);
  10.         CBitmap *bt, *bitmap;
  11.         bitmap = new CBitmap;
  12.         bitmap->CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
  13.         bt = m_dc.SelectObject(bitmap);
  14.         m_dc.FillSolidRect(rect, RGB(255, 255, 255));
  15.         m_dc.SetBkMode(TRANSPARENT);
  16.         m_dc.SetTextColor(RGB(100, 200, 50));
  17.         CPen *oldpen;
  18.         CPen pen;
  19.         pen.CreatePen(PS_DASH, 1, RGB(100, 200, 50));
  20.         oldpen = m_dc.SelectObject(&pen);
  21.         int x, y;
  22.         CRect rc;
  23.         CString s;
  24.         rc.left = rect.left + 5;
  25.         rc.right = rect.right - 5;
  26.         y = rect.top + 5;
  27.         m_dc.MoveTo(rect.left, y);
  28.         for (int i = 0; i <= 5; i++)
  29.         {
  30.                 m_dc.LineTo(rect.right, y);
  31.                 rc.top = y + 5;
  32.                 if (i == 5)
  33.                 {
  34.                         rc.bottom = rc.top;
  35.                         rc.top = rc.bottom - 30;
  36.                 }
  37.                 else
  38.                         rc.bottom = rc.top + 30;
  39.                 s.Format(_T("%.3f"), 350 - i * 350 / 5.0);
  40.                 m_dc.DrawText(s, rc, DT_SINGLELINE | DT_TOP | DT_LEFT);
  41.                 s.Format(_T("%.3f"), 30 - i * 30 / 5.0);
  42.                 m_dc.DrawText(s, rc, DT_SINGLELINE | DT_TOP | DT_RIGHT);
  43.                 y += (rect.Height() - 10) / 5.0;
  44.                 m_dc.MoveTo(rect.left, y);
  45.         }
  46.         pen.Detach();
  47.         pen.CreatePen(PS_SOLID, 2, RGB(10, 10, 10));
  48.         oldpen = m_dc.SelectObject(&pen);
  49.         if (m_shishi1[0] != -1)
  50.         {
  51.                 x = rect.right;
  52.                 y = rect.bottom - 5 - m_shishi1[0] * (rect.Height() - 10) / 30.0;
  53.                 m_dc.MoveTo(x, y);
  54.                 for (int i = 0; i < m_shishi1.GetSize(); i++)
  55.                 {
  56.                         if (m_shishi1[i] == -1)
  57.                                 break;
  58.                         else
  59.                         {
  60.                                 x = rect.right - i * rect.Width() / (float)(m_shishi1.GetSize());
  61.                                 y = rect.bottom - 5 - m_shishi1[i] * (rect.Height() - 10) / 30.0;
  62.                                 m_dc.LineTo(x, y);
  63.                                 m_dc.MoveTo(x, y);
  64.                         }
  65.                 }
  66.         }
  67.         pen.Detach();
  68.         pen.CreatePen(PS_SOLID, 2, RGB(200, 10, 10));
  69.         oldpen = m_dc.SelectObject(&pen);
  70.         if (m_shishi2[0] != -1)
  71.         {
  72.                 x = rect.right;
  73.                 y = rect.bottom - 5 - m_shishi2[0] * (rect.Height() - 10) / 30.0;
  74.                 m_dc.MoveTo(x, y);
  75.                 for (int i = 0; i < m_shishi2.GetSize(); i++)
  76.                 {
  77.                         if (m_shishi2[i] == -1)
  78.                                 break;
  79.                         else
  80.                         {
  81.                                 x = rect.right - i * rect.Width() / (float)(m_shishi2.GetSize());
  82.                                 y = rect.bottom - 5 - m_shishi2[i] * (rect.Height() - 10) / 30.0;
  83.                                 m_dc.LineTo(x, y);
  84.                                 m_dc.MoveTo(x, y);
  85.                         }
  86.                 }
  87.         }
  88.         pen.Detach();
  89.         pen.CreatePen(PS_SOLID, 2, RGB(0, 235, 10));
  90.         oldpen = m_dc.SelectObject(&pen);
  91.         if (m_fuhe1[0] != -1)
  92.         {
  93.                 x = rect.right;
  94.                 y = rect.bottom - 5 - m_fuhe1[0] * (rect.Height() - 10) / 350.0;
  95.                 m_dc.MoveTo(x, y);
  96.                 for (int i = 0; i < m_fuhe1.GetSize(); i++)
  97.                 {
  98.                         if (m_fuhe1[i] == -1)
  99.                                 break;
  100.                         else
  101.                         {
  102.                                 x = rect.right - i * rect.Width() / (float)(m_fuhe1.GetSize());
  103.                                 y = rect.bottom - 5 - m_fuhe1[i] * (rect.Height() - 10) / 350.0;
  104.                                 m_dc.LineTo(x, y);
  105.                                 m_dc.MoveTo(x, y);
  106.                         }
  107.                 }
  108.         }
  109.         pen.Detach();
  110.         pen.CreatePen(PS_SOLID, 2, RGB(145, 13, 110));
  111.         oldpen = m_dc.SelectObject(&pen);
  112.         if (m_fuhe2[0] != -1)
  113.         {
  114.                 x = rect.right;
  115.                 y = rect.bottom - 5 - m_fuhe2[0] * (rect.Height() - 10) / 350.0;
  116.                 m_dc.MoveTo(x, y);
  117.                 for (int i = 0; i < m_fuhe2.GetSize(); i++)
  118.                 {
  119.                         if (m_fuhe2[i] == -1)
  120.                                 break;
  121.                         else
  122.                         {
  123.                                 x = rect.right - i * rect.Width() / (float)(m_fuhe2.GetSize());
  124.                                 y = rect.bottom - 5 - m_fuhe2[i] * (rect.Height() - 10) / 350.0;
  125.                                 m_dc.LineTo(x, y);
  126.                                 m_dc.MoveTo(x, y);
  127.                         }
  128.                 }
  129.         }
  130.         dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &m_dc, 0, 0, rect.Width(), rect.Height(), SRCCOPY);
  131.         pen.Detach();
  132.         pen.DeleteObject();
  133.         m_dc.SelectObject(bt);
  134.         m_dc.SelectObject(oldpen);
  135.         m_dc.DeleteDC();
  136.         delete bitmap;
  137. }
复制代码
最佳答案
70_avatar_small
2020-12-25 17:13:35
GDI 泄漏
除了 CreateCompatibleDC ,所有create都应该手动释放,pen 和bitmap

告诉你个办法,打开任务管理器,查看-> 选择列 ->GDI对象选中 ,然后调试,
理论上来说,进出Onpaint的GDI对象应该是一致的,如果有增加就是GDI泄漏了,好像是超过1万GDI之后,绘图就会出现问题了
异常.png
正常.png




上一篇:winhttp智能指针能访问https的网页吗?
下一篇:求助一下程序运行崩溃是什么原因?
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-12-25 17:13:35 | 显示全部楼层    本楼为最佳答案   
bestAnswer
GDI 泄漏
除了 CreateCompatibleDC ,所有create都应该手动释放,pen 和bitmap

告诉你个办法,打开任务管理器,查看-> 选择列 ->GDI对象选中 ,然后调试,
理论上来说,进出Onpaint的GDI对象应该是一致的,如果有增加就是GDI泄漏了,好像是超过1万GDI之后,绘图就会出现问题了

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 学习了

查看全部评分

71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-25 18:00:27 | 显示全部楼层
tony666 发表于 2020-12-25 17:13
GDI 泄漏
除了 CreateCompatibleDC ,所有create都应该手动释放,pen 和bitmap

我这也手动释放了,pen使用过程中创建了4次,是不是需要创建4个变量,分别释放?
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-12-25 20:37:15 | 显示全部楼层
zzw843 发表于 2020-12-25 18:00
我这也手动释放了,pen使用过程中创建了4次,是不是需要创建4个变量,分别释放?

当然了,create与delete需要一一对应
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-25 21:49:35 | 显示全部楼层
tony666 发表于 2020-12-25 20:37
当然了,create与delete需要一一对应

好的,我先试试
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-26 11:59:10 | 显示全部楼层
tony666 发表于 2020-12-25 20:37
当然了,create与delete需要一一对应

还是不行呀CDC画线资源释放问题
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-12-26 13:47:35 | 显示全部楼层


那只能按照我2楼的方法一步一步调试了CDC画线资源释放问题
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-12-27 10:31:10 | 显示全部楼层
tony666 发表于 2020-12-26 13:47
那只能按照我2楼的方法一步一步调试了

我后来调试看了一下,运行到后期CreateFont失败,也就是Pen是空置,后来把pen不作为局部变量,程序启动时创建,在OnPaint函数里调用,目前看没什么问题。还是多谢了!
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-12-27 11:52:49 | 显示全部楼层
zzw843 发表于 2020-12-27 10:31
我后来调试看了一下,运行到后期CreateFont失败,也就是Pen是空置,后来把pen不作为局部变量,程序启动时 ...

是的,一般这种重复使用的东西,直接作为成员变量更好
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2021-10-27 15:19

Powered by CcTry.CoM

© 2009-2021 cctry.com

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