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

浩子 2007-08-26 01:20:44
我的程序编译运行好像没有问题,但在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);

谢谢,这个问题困扰我很久了,郁闷.
...全文
496 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
浩子 2007-08-30
  • 打赏
  • 举报
回复
嗯,我好好再试下,谢谢各位了...
fronz 2007-08-29
  • 打赏
  • 举报
回复
感觉有点乱,按自己的思路写了一个,你调一下时时.

DLG的.H中加
CBitmap m_Background;
CDC *dc;

OnInitDialog加上
dc=GetDC();
m_Background.LoadBitmap(IDB_MAINBK);

其余
.........
//CPaintDC dc(this);//注释掉这局
CDC dcMem;
dcMem.CreateCompatibleDC(dc);

CBitmap *pbmpOld=dcMem.SelectObject(&m_Background);
BITMAP bitMap;

m_Background.GetObject(sizeof(BITMAP),&bitMap);
dc->BitBlt(0,0,1024,768,&dcMem,0,0,1024,768,SRCCOPY);//不理解,为什么不设边角?

dcMem.SelectObject(pbmpOld);
dcMem.DeleteDC();
m_Background.DeleteObject();//CBITMAP对象可以用这个方法,而BITMAP结构不能.
浩子 2007-08-29
  • 打赏
  • 举报
回复
我快崩溃了,谁有一个可稳定运行的代码段,
我只是要为一个对话框窗口设置一个背景罢了,为什么这么难搞呢...
浩子 2007-08-27
  • 打赏
  • 举报
回复
void CTIManagerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);

CBitmap *pbmpOld=dcMem.SelectObject(&m_Background);
dc.StretchBlt(0,0,1024,768,&dcMem,0,0,1024,768,SRCCOPY);

if(pbmpOld)
dcMem.SelectObject(pbmpOld);

dcMem.DeleteDC();

m_sCurTime.SetBkColor(RGB(185,194,201));
m_sCurTime.SetForeColor(RGB(255,255,255));

m_sVersion.SetBkColor(RGB(185,194,201));
m_sVersion.SetForeColor(RGB(255,255,255));
}
}

m_sCurTime,m_sVersion是两个重写过的Static类实例
菜牛 2007-08-27
  • 打赏
  • 举报
回复
你把OnPaint里面的代码都贴出来。
leaf__leaf 2007-08-27
  • 打赏
  • 举报
回复
信息不够。
试着在每一行后面加一句:TRACE("%d\n", __LINE__);这样每执行一行就会打印该行行号,然后在出错时,看看输入窗口里最后打印出来的是第几行。还有,出错时,系统说的是异常吗?还是非法内存访问?以及信息?
浩子 2007-08-27
  • 打赏
  • 举报
回复
if(pbmpOld)去掉也试过了,一样的结果,
liuxiuk 2007-08-27
  • 打赏
  • 举报
回复
BITMAP bitMap;
m_Background.GetBitmap(&bitMap);
-----
HBITMAP bitMap;
bitMap = (HBITMAP)operator HBITMAP();
m_Background.GetBitmap(&bitMap);

你的bitMap没初始化吧
浩子 2007-08-27
  • 打赏
  • 举报
回复
谢谢,我试了一下,这样做后,当有窗口移过时,经常不能刷新背景,不知如何解决...
hapen_zhang 2007-08-27
  • 打赏
  • 举报
回复
同意楼上的,把dcMem定义成全局试试
dcMem.CreateCompatibleDC(&dc);
放到OnCreate()中比较好
菜牛 2007-08-27
  • 打赏
  • 举报
回复
这段代码不像有错的。
不过你可以把
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);

CBitmap *pbmpOld=dcMem.SelectObject(&m_Background);
dc.StretchBlt(0,0,1024,768,&dcMem,0,0,1024,768,SRCCOPY);

if(pbmpOld)
dcMem.SelectObject(pbmpOld);

dcMem.DeleteDC();
放到OnEraseBkgnd()中去,把
m_sCurTime.SetBkColor(RGB(185,194,201));
m_sCurTime.SetForeColor(RGB(255,255,255));

m_sVersion.SetBkColor(RGB(185,194,201));
m_sVersion.SetForeColor(RGB(255,255,255));
放到OnInitDialog()中去。
菜牛 2007-08-26
  • 打赏
  • 举报
回复
把if(pbmpOld)去掉试试。
浩子 2007-08-26
  • 打赏
  • 举报
回复
bitMap.DeleteObject()不行,没有可用的DeleteObject方法.

刚才测试结果是,Release版也出错,不过对程序运行没影响,出现了花屏,唉...
shawnwan 2007-08-26
  • 打赏
  • 举报
回复
主要是看看有无GDI资源泄漏
shawnwan 2007-08-26
  • 打赏
  • 举报
回复
感觉上是资源耗尽的原因,bitMap.DeleteObject()看看,
浩子 2007-08-26
  • 打赏
  • 举报
回复
再次检查了一下,确定没有其他地方用了,我现在在测试看REALEASE版本下有没有这个问题...
菜牛 2007-08-26
  • 打赏
  • 举报
回复
这段代码似乎没有错误,看看有没有别的地方用到了m_Background

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧