请教LoadBitmap的问题(程序跑死)

raylin 2009-04-29 03:34:52
请问一下以下代码有什么问题?
m_ctrl1都是CStatic(图形控件),为什么我的鼠标在界面上晃多几下,程序就跑死了? 下面是相关代码:
void InitImage()
{
HBITMAP hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_SEARCH));
m_ctrl1.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_LOCAL));
m_ctrl2.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BOOK));
m_ctrl3.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_FRIENDS));
m_ctrl4.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_DOWNLOAD));
m_ctrl5.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_UPLOAD));
m_ctrl6.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_RESULT));
m_ctrl7.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_HISTORY));
m_ctrl8.SetBitmap(hBitmap);
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_NEWS));
m_ctrl9.SetBitmap(hBitmap);
m_strInfo="";
UpdateData(FALSE);
}
void CDlgLeftPanel::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);

InitImage();
return;
}
...全文
130 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nealfei 2011-11-01
  • 打赏
  • 举报
回复
卡不懂,知识找找我的问题是不是这里可以找到答案而已
raylin 2009-04-29
  • 打赏
  • 举报
回复
谢谢楼上几位,但我发现用::DeleteObject之后,我在OnInitDialog调用了InitImage,但一开始时界面显示不出来那些图片,不知道怎么回事? 如如果去掉::DeleteObject就会显示,但却有内存泄露.
xghuzd 2009-04-29
  • 打赏
  • 举报
回复
为什么我的鼠标在界面上晃多几下,程序就跑死了

你只分配 hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_SEARCH));
m_ctrl1.SetBitmap(hBitmap);

不释放 //::DeleteObject(hBitmap);

晃多几下//InitImage();可能就不知道被执行了几次了,
这样系统资源都被用完,所以立马死了.
xtjqu 2009-04-29
  • 打赏
  • 举报
回复
你要做的大概只是鼠标进入事件吧(类似.net的OnMouseEnter之类的)
1.设置一个标志位,FALSE
2.在ONMOUSEMOVE里判断标志,如果为FALSE就INIT,
3.做个定时器SetTimer,设置标志为TRUE
4.OnTimer 时间到了之后判断鼠标是不是还在,如果在,继续定时TRUE
5.如果不在,那就把标志位撤了FALSE(可能还要再换另一批BITMAP??)
Ryanwen 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 raylin 的回复:]
谢谢几位,原来还要DeleteObject的.


init只需要做一次就行了,不能实时做
-------------------
但是我的代码要实现鼠标到图片控件上面时,该控件上面图片更改,init只能在mousemove里面调用了,我现在想到的办法是如果上次mousemove在图片控件上面,我才调用initimage,这样就少调用很多次init了,不知道还有没有其他
办法?
[/Quote]

要动态改变图片可以重载CStatic控件 改写DrawItem函数 捕获鼠标事件 当鼠标在控件上时显示一副图片 不在时显示另一幅
luckyboy101 2009-04-29
  • 打赏
  • 举报
回复
需要释放资源
DeleteObject(hBitmap);
biweilun 2009-04-29
  • 打赏
  • 举报
回复
用vc做这种东西很不明智
biweilun 2009-04-29
  • 打赏
  • 举报
回复
哈哈,肯定死的
raylin 2009-04-29
  • 打赏
  • 举报
回复
谢谢几位,原来还要DeleteObject的.


init只需要做一次就行了,不能实时做
-------------------
但是我的代码要实现鼠标到图片控件上面时,该控件上面图片更改,init只能在mousemove里面调用了,我现在想到的办法是如果上次mousemove在图片控件上面,我才调用initimage,这样就少调用很多次init了,不知道还有没有其他
办法?
Ryanwen 2009-04-29
  • 打赏
  • 举报
回复
问题1楼都说了
添加下一个资源前先释放
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_SEARCH));
m_ctrl1.SetBitmap(hBitmap);
::DeleteObject(hBitmap);
moren123 2009-04-29
  • 打赏
  • 举报
回复
m_ctrl1.SetBitmap(hBitmap);
之后:
DeleteObject(hBitmap);
bobob 2009-04-29
  • 打赏
  • 举报
回复
每一个鼠标移动你就要load10个图片资源,而且还各个都没释放,不死才怪

init只需要做一次就行了,不能实时做

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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