关于在OnPaint中刷新背景图片出错有关问题的解决

关于在OnPaint中刷新背景图片出错问题的解决

我的程序编译运行好像没有问题,但在DEBUG时,
如果运行长点时间就会报错,具体内容如下,望高手帮忙.
==================================================
头文件中定义:
private:
CBitmap m_Background;
==================================================
在OnInitDialog中有如下:
......
m_Background.LoadBitmap(IDB_MAINBK);
......
==================================================
OnPaint代码段如下:
......
CPaintDC   dc(this);
CDC   dcMem;  
dcMem.CreateCompatibleDC(&dc);
BITMAP   bitMap;
m_Background.GetBitmap(&bitMap);
CBitmap   *pbmpOld=dcMem.SelectObject(&m_Background);
dc.StretchBlt0,0,bitMap.bmWidth,bitMap.bmHeight,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);  

if(pbmpOld)
      dcMem.SelectObject(pbmpOld);

dcMem.DeleteDC();
......

===================================================
出错会停在一个叫dbgrpt.c的文件中,
代码段如下:

#undef   _CrtDbgBreak

_CRTIMP   void   _cdecl   _CrtDbgBreak(
                void
                )
{
                DebugBreak();
}
再继续运行会停在Onpaint中的如下代码处:
CBitmap   *pbmpOld=dcMem.SelectObject(&m_Background);

谢谢,这个问题困扰我很久了,郁闷.

------解决方案--------------------
你还得用deleteobject将CBitmap释放掉
------解决方案--------------------
你的dcMem最好定义成全局的吧
还有就是
dcMem.CreateCompatibleDC(&dc);
BITMAP bitMap;
m_Background.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_Background);
这段可以放在OnInitDialog里面实现
用不着每次OnPaint时都创建然后选择吧
OnPaint里面要做的只要StretchBlt
我不确定这能不能解决你的问题 试试吧。。
------解决方案--------------------
程序停在
CBitmap *pbmpOld=dcMem.SelectObject(&m_Background);
可能是程序中m_Background变量的内容有发生了变化,你注意这个变量是否在什么地方被改动了,至于每次给这个变量重新给值倒不必了。

如果你只是想改变对话框的背景图片,你可以考虑使用消息WM_CTLCOLOR,只需要将返回的Brush换成你的m_Background就可以了
------解决方案--------------------
CBitmap m_bitmap;//全局
CDC memdc;//全局
CClientDC clientdc(this);
memdc.DeleteDC();
m_bitmap.DeleteObject();
m_bitmap.LoadBitmap(IDB_BITMAP1);
memdc.CreateCompatibleDC(NULL);
memdc.SelectObject(&m_bitmap);
clientdc.BitBlt(tmpMap[i].x,tmpMap[i].y,71,96,&memdc,0,0,SRCCOPY);

你再用类似上面的代码试试