双缓冲文字输出内存泄露?怎么改?
本帖最后由 VisualEleven 于 2012-11-18 12:09:47 编辑 最近做一个监控界面,需要使用大字体刷新测量数据,出现故障时需要将字色变为红色
我定义了一个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;
}
m_hdcMem.SelectObject(&m_hBitmap);
CString strText = _T("");
GetWindowText(strText);
....
m_hdcMem.FillRect(&rect, m_pBrush);//填充黑色
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.DeleteDC();
m_hBitmap.DeleteObject();
m_hdcMem.SelectObject(m_OldFont);
m_hdcMem.SelectObject(m_OldBMP);
m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();
}
内存泄露明显少了很多
但是还是有 。。。
天啦。。。。。
[其他解释]
应该是m_hdcMem.SelectObject(&m_hBitmap); 这个丢的,这个你没有还原回去,删除不掉的
CBitMap *old = m_hdcMem.SelectObject(&m_hBitmap);
......
m_hdcMem.SelectObject(old );
m_hdcMem.DeleteObject();
[其他解释]
现在在类里面增加了要显示的TXT变量和一个类函数SHOWTEXT
将OnPaint中的GetWindowText去掉,和TXT变量联系起来进行写DC
在SHOWTEXT中接收并修改TXT变量
调用Invalidate(FALSE)强制刷新界面,就没有泄露了
但是如果调用Invalidate(TRUE)就还有泄露。。。。
不知道为什么,有谁知道吗?
PS
在WIN32环境下用同样的类,
SetWindowText发现居然不显示带色的大字体,还是显示的默认的字体和颜色
调试发现完全就没有调用OnPaint。。。。
用其他窗口遮盖后,引起界面刷新就可以看到Paint后的界面了,不过马上又回到默认了
那就是说SetWindowText在WinCE和Win32下的机制是不同的?
还是说所有的问题都是VS 2008的问题?
弄个EVC或VS2005之类的在试试
[其他解释]
我现在是单独的一个小程序,仅仅只实现用Timer
在timr中Random数据,然后显示到文本控件中
还有程序是都选入、选出了的了
。。。。开头的双缓冲程序是有点问题的,后来我改了
[其他解释]
InvalidateRect()如何?估计还是程序内部问题,多线程之间传递消息有不干净的内存,并且在windows消息中传播.还有有些字体不是所有系统都支持,比如在win7下有些字体会是乱码...
[其他解释]
.cpp
// ColorStatic.cpp Version 1.0
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ColorStatic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////////
// CColorStatic
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
//{{AFX_MSG_MAP(CColorStatic)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////////
// constructor
CColorStatic::CColorStatic()
{
m_rgbText = GetSysColor(COLOR_BTNTEXT);
m_rgbBackground = GetSysColor(COLOR_BTNFACE);
m_bBold = FALSE;
m_ShowText= _T("");
m_bTrans= TRUE;
m_Align= SS_CENTER;
}
///////////////////////////////////////////////////////////////////////////////
// destructor
CColorStatic::~CColorStatic()
{
TRACE(_T("in CColorStatic::~CColorStatic\n"));
}
///////////////////////////////////////////////////////////////////////////////
// OnPaint
void CColorStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC m_hdcMem;
CBitmap m_hBitmap;
CFont m_font;
CBrush m_Brush;
CString sShowText;
if (m_hdcMem.CreateCompatibleDC(NULL) == 0) //Create Fail
{
//m_hdcMem.DeleteDC();
return;
}
CRect rect;
GetClientRect(&rect);
if (m_hBitmap.CreateCompatibleBitmap(&dc ,rect.Width(), rect.Height()) == 0) //Create Fail
{
//m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();
return;
}
if (!m_font.CreateFont(m_iFontSize, 0, 0, 0, 0, FALSE, FALSE, 0,
GB2312_CHARSET, 0, 0, 0, 0,m_sFontName)) //Create Fail
{
m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();
return;
}
if (!m_Brush.CreateSolidBrush(m_rgbBackground)) //Create Fail
{
m_font.DeleteObject();
m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();
return;
}
CBitmap *m_OldBMP =m_hdcMem.SelectObject(&m_hBitmap);
CFont * m_OldFont = m_hdcMem.SelectObject(&m_font);
GetWindowText(sShowText);
UINT nFormat = 0;
if ((m_Align & SS_CENTER) >0)
nFormat
[其他解释]
这个类的代码如下
.h
// ColorStatic.h
///////////////////////////////////////////////////////////////////////////////
#ifndef COLORSTATIC_H
#define COLORSTATIC_H
/////////////////////////////////////////////////////////////////////////////
// CColorStatic window
class CColorStatic : public CStatic
{
// Construction
public:
CColorStatic();
virtual ~CColorStatic();
// Attributes
public:
void SetBackgroundColor(COLORREF rgb, BOOL bRedraw = TRUE);
void SetTextColor(COLORREF rgb, BOOL bRedraw = TRUE);
void SetFont(LPCTSTR lpszFaceName, int nPointSize);
void SetTrans(bool bTranslate);
void ShowText(LPCTSTR sText);
void SetAlign(DWORD dAlign);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorStatic)
protected:
// virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
protected:
COLORREFm_rgbText;
COLORREFm_rgbBackground;
BOOLm_bBold;
BOOLm_bTrans;
intm_iFontSize;
CStringm_ShowText;
DWORDm_Align; //SS_CENTER SS_LEFT SS_RIGHT
LPCTSTRm_sFontName;
int GetFontHeight(int nPointSize);
// Generated message map functions
protected:
//{{AFX_MSG(CColorStatic)
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif //COLORSTATIC_H
[其他解释]
= DT_LEFT;
else if ((m_Align & SS_RIGHT) > 0)
nFormat
[其他解释]
= DT_CENTER;
else if ((m_Align & SS_LEFT) > 0)
nFormat