void CSonicView::InitalMemDc()
{
CBrush brushBack;
brushBack.CreateSolidBrush( m_crBackColor) ;
CRect rectClient;
GetClientRect(rectClient);

CClientDC dc(this);
//创建设备环境以及创建相应缓冲区

if ( m_MemDC.GetSafeHdc() != NULL )
{
if ( m_pOldBmp != NULL )
{
m_MemDC.SelectObject(m_pOldBmp);
}
m_Bitmap.DeleteObject();
m_MemDC.Detach();
m_MemDC.DeleteDC();

}

if (m_MemDC.GetSafeHdc() == NULL)
{
m_MemDC.CreateCompatibleDC(&dc);
if(m_Bitmap.CreateCompatibleBitmap(&dc,rectClient.Width(), m_BitmapHeight) == NULL )
{
CString strTmp = "请关闭软件重新打开!";
AfxMessageBox(strTmp);
}
m_pOldBmp = m_MemDC.SelectObject(&m_Bitmap);
}

//设置背景颜色
m_MemDC.SetBkColor( m_crBackColor);
rectClient.bottom = m_BitmapHeight;    //填充背景色时背景的高度
m_MemDC.FillRect(rectClient,&brushBack);

brushBack.DeleteObject();}void CSonicView::DrawStandardColor()
{
CBrush redbrush, greenbrush,yellowbrush, orangebrush;
CBrush *oldBrush;
redbrush.CreateSolidBrush( RGB(255, 0, 0));
yellowbrush.CreateSolidBrush( RGB(255, 255, 128));
orangebrush.CreateSolidBrush( RGB(192, 192, 0));
greenbrush.CreateSolidBrush( RGB( 0, 255, 0));
oldBrush = m_MemDC.SelectObject(&redbrush); CFont Font,*oldFont;

Font.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, 
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, 
DEFAULT_PITCH|FF_SWISS, _T("宋体")) ;

oldFont = m_MemDC.SelectObject(&Font);

if (m_MemDC.GetSafeHdc() != NULL)
{
CRect rectClient;
GetClientRect(rectClient) ; CPoint ptOld; ptOld.x = rectClient.left + 50;
ptOld.y = 2;

CRect rc(ptOld.x, ptOld.y, ptOld.x + 50, ptOld.y+16);
m_MemDC.FillRect(rc, &greenbrush);
m_MemDC.TextOut(ptOld.x+52, ptOld.y, "均正常");
ptOld.x += rectClient.right/4;

CRect rc1(ptOld.x, ptOld.y, ptOld.x + 50, ptOld.y+16);
m_MemDC.FillRect(rc1, &yellowbrush);
m_MemDC.TextOut(ptOld.x+55, ptOld.y, "声速异常");
ptOld.x += rectClient.right/4;


CRect rc2(ptOld.x, ptOld.y, ptOld.x + 50, ptOld.y+16);
m_MemDC.FillRect(rc2, &orangebrush);
m_MemDC.TextOut(ptOld.x + 55, ptOld.y, "幅值异常");
ptOld.x += rectClient.right/4;

CRect rc3(ptOld.x, ptOld.y, ptOld.x + 50, ptOld.y+16);
m_MemDC.FillRect(rc3, &redbrush);
m_MemDC.TextOut(ptOld.x+55, ptOld.y, "均异常");
}
m_MemDC.SelectObject(oldFont);
Font.DeleteObject();

m_MemDC.SelectObject(oldBrush);
greenbrush.DeleteObject();
orangebrush.DeleteObject();
yellowbrush.DeleteObject();
redbrush.DeleteObject();
}

解决方案 »

  1.   


    那我写的画图界面怎么随着更新次数的增加就不能再画了
    会出现CString strTmp = "请关闭软件重新打开!";
    AfxMessageBox(strTmp);
    这两行代码的执行窗口。
      

  2.   

    这个应该和Brush没关系。先用GetLastError看一下
      

  3.   

    GetLastError()函数调用的结果是返回值为0。意思是什么啊?
      

  4.   

    InitalMemDc()是在哪里调用的。此时
    GetClientRect(rectClient);获取的rectClient是否是(0,0,0,0)
    CClientDC dc(this);this指针是否有效?
      

  5.   

    InitalMemDc最好放在OnPaint里面,或者在OnDraw里面直接用pDC而不是CClientDC dc
      

  6.   

    把你绘图操作的代码最好放到OnDraw函数中
      

  7.   

    InitalMemDc()在初始化更新里面调用过,在OnSize函数里面调用过。为了避免画图时闪频,我创建内存设备环境以及创建相应缓冲区,InitalMemDc()里面创建的那个位图大小是动态改变的。我画图是在OnDraw里面调用的,然后在OnPaint里面调用了OnDraw
    现在估计就是资源泄漏的问题。我想可能出现的地方就是这两个函数里面。请大家帮忙看看InitalMemDc()函数放在OnPaint() 里面和其他地方有什么区别啊?void CWaveView::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    OnPrepareDC(&dc);
    OnDraw(&dc);
    CRect rectClient;
    GetClientRect(rectClient) ;

    if (m_MemDC.GetSafeHdc() != NULL)
    { dc.BitBlt(0, 0, rectClient.Width(), m_BitmapHeight, 
    &m_MemDC, 0, 0, SRCCOPY) ;
    }
    }
    m_BitmapHeight这个变量就是动态改变位图高度的一个变量