想用gdi+实现双缓存画对话框的背景图。//.h
CDC m_memDC;
CBitmap m_memBitmap;
CBitmap * m_pOldBitmap;//.cpp
void CFirstPageDlg::OnPaint()
{
m_memDC.CreateCompatibleDC(NULL);
CDC * pDC = this->GetDC();
m_memBitmap.CreateCompatibleBitmap(pDC, 2000, 2000); m_pOldBitmap = m_memDC.SelectObject(&m_memBitmap);
m_memDC.FillSolidRect(0,0,2000,2000,RGB(100,100,100)); Image img(L"china.jpg");
Graphics g(m_memDC.GetSafeHdc());
g.DrawImage(&img,0,0,img.GetWidth(),img.GetHeight()); m_memDC.SelectObject(m_pOldBitmap); pDC->BitBlt(0,0,200,200,&m_memDC,0,0,SRCCOPY); ReleaseDC(pDC);
}程序崩溃!!!!
弹出一个错误对话框:GameClient.exe has triggered a breakpoint
程序是死在了:
//dbgrptt.c文件的
_CRTIMP void _cdecl _CrtDbgBreak(
    void
    )
{
    DebugBreak();
}//死在这里。请问是哪里画错了

解决方案 »

  1.   

    CDialog::OnPaint();
    需要加一个这个进去,但是你这个有问题,无法显示出来,你还要再看看
      

  2.   

    m_memDC.SelectObject(m_pOldBitmap);
    pDC->BitBlt(0,0,200,200,&m_memDC,0,0,SRCCOPY);????--->?????pDC->BitBlt(0,0,200,200,&m_memDC,0,0,SRCCOPY);
    m_memDC.SelectObject(m_pOldBitmap); 不过这个应该不会崩溃,你try,catch下。
      

  3.   

    虽然完全搞不懂为什么在OnPaint里面这么使用内存绘图 但是还是先解决了崩溃的问题再说,把下面的这块代码只留下CDC * pDC = this->GetDC();就行了:
    m_memDC.CreateCompatibleDC( NULL );
    CDC * pDC = this->GetDC();
    m_memBitmap.CreateCompatibleBitmap(pDC, 2000, 2000);然后去CFirstPageDlg的OnInitialDlg或者其他初始化得地方添加:
    m_memDC.CreateCompatibleDC( NULL );
    CDC * pDC = this->GetDC();
    m_memBitmap.CreateCompatibleBitmap(pDC, 2000, 2000);
    你的问题好像是在DC被重复创建了,所以产生错误, OnPaint可不是执行一次的啊 每次执行都要把你前面没有销毁的CDC和 BMP对象重新创建一遍肯定会出错的。还有一种方法就是,不要使用全局变量,直接把m_memDC和m_memBitmap定义也放到OnPaint中去,也不会出错。另外,我一般不会再OnPaint中使用内存绘图,我都放到其他的地方,鼠标移动,落下,事件触发的地方。参考 呵呵
      

  4.   

    在末尾追加:m_memDC.DeleteDC();
    ReleaseDC(pDC);
      

  5.   

    不死才怪!
    m_memDC你不停的创建,不停的select。
    能不死吗?
      

  6.   

    CDC m_memDC;
    CBitmap m_memBitmap;
    CBitmap * m_pOldBitmap;改为局部变量