主题:EM9170:双缓冲文字输出老是出问题,帮看看

  共有31378人关注过本帖    
帅哥哟,离线,有人找我吗?
shepher
1楼 信息 | 搜索 | 邮箱


加好友 发短信
EM9170:双缓冲文字输出老是出问题,帮看看  发帖心情 Post By:2012-11-18 10:51:00   [只看该作者]

最近做一个监控界面,需要使用大字体刷新测量数据,出现故障时需要将字色变为红色

我定义了一个CColorStatic类
在OnPaint中写的输出

CPaintDC dc(this);
CDC m_hdcMem;
CBitmap m_hBitmap;

if (m_hdcMem.CreateCompatibelDC(NULL) == 0)
{
    m_hdcMem.DeleteDC();
    return;
}

CRect rect;

GetClientRect(&rect);

if (m_hBitmap.CreateCompatibleBitmap(&dec, Rect.Width() + 1, rect.Height() + 1) == 0)
{
    m_hBitmap.DeleteObject();
    m_hdcMem.DeleteDC();
    return;

}

CBitmap * m_hOldBMP = m_hdcMem.SelectObject(&m_hBitmap);

CString strText = _T("");
GetWindowText(strText);
....

m_hdcMem.FillRect(&rect, m_pBrush);//填充黑色
CFont * m_hOldFont = m_hdcMem.SelectObject(&m_font); //使用大字体
m_hdcMem.SetTextColor(m_rgbText);
m_hdcMem.SetBkMode(TRANSPARENT);
m_hdcMem.DrawText(strText, rect, nFormat); 
//nFormat是设置文字左中右的,用的DWORD dwStyle = GetStyle()

dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_hdcMem, 0, 0, SRCCOPY);

m_hdcMem.SelectObject(m_hOldFont);

m_hdcMem.SelectObject(m_hOldBMP);
m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();


界面上有10个CColorStatic控件需要刷新,刷新频率为1秒一次
发现程序运行后,开头30秒左右内存使用一直没问题,之后大约4秒左右
程序使用内存增加4K的样子,时间久了之后,如果打开其他功能界面,
就会出现一些CColorStatic框变成了其他功能界面的图形,且在也不能刷新了

在调试过程中试过将刷新的timer禁用,内存一直不会增长。
试过将BitBlt这一句注释,发现内存也不会增长。。。。。!!!

现在就不知道是哪儿的问题了。

高手帮看看


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
2楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2012-11-19 10:28:00   [只看该作者]

光这段代码没看出有什么问题,也与内存无关。OnPaint是当窗口刷新时才会调用,一般是窗口显示或者顶层遮挡的窗口移动的时候才行。你这个情况感觉OnPaint根本没有被调用到,你的timer里是怎么刷新窗口的呢?用Invalidate?要不你去掉部分控件窗口,然后在OnPaint里面设个断点,然后看看出问题时这个OnPaint到底调用到没有。

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
3楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2012-11-21 13:43:00   [只看该作者]

看了你的代码,发现只要使用了自定义控件,在刷新控件的时候就可能会4kb,4kb这样增加占用的内存,当增加到一定程度后就会开始有释放,然后稳定在一个位置,估计是GDI的一个机制吧,不是你代码的问题,关闭窗口后过一会这部分内存就释放了,不会影响到应用,你可以通过设置将用户使用内存再设大些。
[此贴子已经被作者于2012-11-21 13:43:40编辑过]

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
4楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2012-11-22 11:05:00   [只看该作者]

恩,这个问题算解决了。
如果自定义控件,并且重写了ON_WM_ERASEBKGND的处理函数,擦背景时就容易导致4kb的内存占用,所以只有使用Invalidate(FALSE);更新时不擦除背景。
或者不要重写这个消息的处理函数,就不会出问题了。

  单帖管理 | 引用 | 回复 回到顶部

返回首页

EM9170:双缓冲文字输出老是出问题,帮看看

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: