----->Static 静态文本控件,透明背景,内存泄漏问题!!

当我遇上-你 2012-06-15 02:42:39
照的这篇文章做的
http://blog.csdn.net/cashey1991/article/details/7545614
能达到效果,但是在频繁改变文本内容的情况下,内存会一直增加,调试到OnEraseBkgnd函数的
 // 拷贝对应区域主框显示的内容   
95. CDC *pDC = pParent->GetDC();
96. CDC MemDC;
97. MemDC.CreateCompatibleDC(pDC);
98. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
99. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
100. MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
101. MemDC.SelectObject(pOldBmp);
102. pParent->ReleaseDC(pDC);

引起的内存泄漏
在最后添加了
Memdc.DeleteDc();
m_Bmp.DeleteObject();

还是未解决,大家帮忙看看,怎么回事,谢谢!
...全文
217 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-03-07
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
schlafenhamster 2012-06-15
  • 打赏
  • 举报
回复
“那在另外一个判断中执行有啥问题吗?”
不明白
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
CDC MemDC;
97. MemDC.CreateCompatibleDC(pDC);
98. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
99. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
2个Create2个DeleteObjec……
[/Quote]
那在另外一个判断中执行有啥问题吗?
zdcju 2012-06-15
  • 打赏
  • 举报
回复
貌似没有问题呀
别pParent->ReleaseDC(pDC);

直接 ReleaseDC(pDC);试试
schlafenhamster 2012-06-15
  • 打赏
  • 举报
回复
CDC MemDC;
97. MemDC.CreateCompatibleDC(pDC);
98. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
99. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
2个Create2个DeleteObject
DeleteObject(MemDC)
DeleteObject(m_Bmp)// 这个m_Bmp 要保留的,只能产生一次,在析构中Delete
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
大家帮忙看看啊
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
BOOL CRichStatic::OnEraseBkgnd(CDC* pDC)  
82.{
83. // 当背景色为透明时,需要保存与拷贝显示主框的显示区域
84. if (m_clrBackground == CLR_NONE)
85. {
86. if (m_Bmp.GetSafeHandle() == NULL)
87. {
88. CRect Rect;
89. GetWindowRect(&Rect);
90. CWnd *pParent = GetParent();
91. ASSERT(pParent);
92. pParent->ScreenToClient(&Rect); // 将坐标转换为与主对话框相对应
93.
94. // 拷贝对应区域主框显示的内容
95. CDC *pDC = pParent->GetDC();
96. CDC MemDC;
97. MemDC.CreateCompatibleDC(pDC);
98. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
99. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
100. MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
101. MemDC.SelectObject(pOldBmp);
102. pParent->ReleaseDC(pDC);
103. }
104. else // 将主框显示的内容拷贝回去
105. {
106. // CRect Rect;
107. // GetClientRect(Rect);
108. // CDC MemDC;
109. // MemDC.CreateCompatibleDC(pDC);
110. // CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
111. // pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
112. // MemDC.SelectObject(pOldBmp);
113. }
114. }
115.
116. return TRUE;
117.}

就这样的,还是内存还是增加啊 ,加不加
Memdc.DeleteDc();
m_Bmp.DeleteObject();
效果一样的增加哈
dahaiI0 2012-06-15
  • 打赏
  • 举报
回复
要不楼主把整个OnEraseBkgnd贴上来看看,另外那个else分支里的CreateCompatibleDC有么有deleteobject
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用楼主 的回复:
照的这篇文章做的
http://blog.csdn.net/cashey1991/article/details/7545614
能达到效果,但是在频繁改变文本内容的情况下,内存会一直增加,调试到OnEraseBkgnd函数的

C/C++ code
// 拷贝对应区域主框显示的内容
95. CDC *pDC = pParent->GetDC();
……

……
[/Quote]
不加内存也一样的涨,你们可以搞个简单的测试下
安乐风流 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
照的这篇文章做的
http://blog.csdn.net/cashey1991/article/details/7545614
能达到效果,但是在频繁改变文本内容的情况下,内存会一直增加,调试到OnEraseBkgnd函数的

C/C++ code
// 拷贝对应区域主框显示的内容
95. CDC *pDC = pParent->GetDC();
……
[/Quote]


那两句话 不要加在最后啊
schlafenhamster 2012-06-15
  • 打赏
  • 举报
回复
凡是Create的要DeleteObject
凡是Get的要Release
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
我说的是这里面的。


C/C++ code


void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (m_clrBackground != CLR_NONE) // 若背景色不为CLR_NONE(CLR_NONE表示无背景色),则绘制背景
{
……
[/Quote]
  RECT rect;  
GetWindowRect(&rect);
CBrush brush;
brush.CreateSolidBrush(m_clrBackground);
::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject); // 设置画刷颜色
::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN)); // 设置笔为空笔(不绘制边界)
Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top);

已经屏蔽了,把 OnEraseBkgnd里面的屏蔽就不涨了
dahaiI0 2012-06-15
  • 打赏
  • 举报
回复
CBrush brush;
brush.CreateSolidBrush(m_clrBackground);
这个brush频繁创建,但是没有释放。3个SelectObject,如果是我写的话都会成对出现。
dahaiI0 2012-06-15
  • 打赏
  • 举报
回复
我说的是这里面的。


void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (m_clrBackground != CLR_NONE) // 若背景色不为CLR_NONE(CLR_NONE表示无背景色),则绘制背景
{
RECT rect;
GetWindowRect(&rect);
CBrush brush;
brush.CreateSolidBrush(m_clrBackground);
::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject); // 设置画刷颜色
::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN)); // 设置笔为空笔(不绘制边界)
Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top);
}

CString strCaption; // 标题文字
GetWindowText(strCaption);
if (m_pTextFont != NULL)
{
::SelectObject(lpDrawItemStruct->hDC, m_pTextFont->m_hObject);
}
::SetTextColor(lpDrawItemStruct->hDC, m_clrText);
TextOut(lpDrawItemStruct->hDC, 0, 0, strCaption, strCaption.GetLength());
}


你把OnEraseBkgnd屏蔽了还涨吗?是的话就看下DrawItem里的
当我遇上-你 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
CreateSolidBrush,这里没有释放,而且个人觉得SelectObject后还要SelectObject回来,这里应该是有必要这样做的。
[/Quote]
98. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
99. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
100. MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
101. MemDC.SelectObject(pOldBmp);

把上面的都屏蔽了,还是内存在增加
只有CreateCompatibleDC在创建了,怎么回事呢?
dahaiI0 2012-06-15
  • 打赏
  • 举报
回复
我的一楼回复怎么被吞了。。这蛋都碎了。。
dahaiI0 2012-06-15
  • 打赏
  • 举报
回复
CreateSolidBrush,这里没有释放,而且个人觉得SelectObject后还要SelectObject回来,这里应该是有必要这样做的。


dahaiI0 2012-06-15
  • 打赏
  • 举报
回复

void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (m_clrBackground != CLR_NONE) // 若背景色不为CLR_NONE(CLR_NONE表示无背景色),则绘制背景
{
RECT rect;
GetWindowRect(&rect);
CBrush brush;
brush.CreateSolidBrush(m_clrBackground);//这里
::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject); // 设置画刷颜色
::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN)); // 设置笔为空笔(不绘制边界)
Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top);
}

CString strCaption; // 标题文字
GetWindowText(strCaption);
if (m_pTextFont != NULL)
{
::SelectObject(lpDrawItemStruct->hDC, m_pTextFont->m_hObject);
}
::SetTextColor(lpDrawItemStruct->hDC, m_clrText);
TextOut(lpDrawItemStruct->hDC, 0, 0, strCaption, strCaption.GetLength());
}

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧