请问一下以下代码有什么问题?
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;
}

解决方案 »

  1.   

    每一个鼠标移动你就要load10个图片资源,而且还各个都没释放,不死才怪init只需要做一次就行了,不能实时做
      

  2.   

    m_ctrl1.SetBitmap(hBitmap); 
    之后:
    DeleteObject(hBitmap);
      

  3.   

    问题1楼都说了
    添加下一个资源前先释放   
    hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_SEARCH)); 
    m_ctrl1.SetBitmap(hBitmap); 
    ::DeleteObject(hBitmap);
      

  4.   

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

  5.   

    需要释放资源
    DeleteObject(hBitmap);
      

  6.   


    要动态改变图片可以重载CStatic控件   改写DrawItem函数   捕获鼠标事件  当鼠标在控件上时显示一副图片  不在时显示另一幅
      

  7.   

    你要做的大概只是鼠标进入事件吧(类似.net的OnMouseEnter之类的)
    1.设置一个标志位,FALSE
    2.在ONMOUSEMOVE里判断标志,如果为FALSE就INIT,
    3.做个定时器SetTimer,设置标志为TRUE
    4.OnTimer 时间到了之后判断鼠标是不是还在,如果在,继续定时TRUE
    5.如果不在,那就把标志位撤了FALSE(可能还要再换另一批BITMAP??)
      

  8.   

    为什么我的鼠标在界面上晃多几下,程序就跑死了你只分配 hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_SEARCH)); 
    m_ctrl1.SetBitmap(hBitmap); 不释放 //::DeleteObject(hBitmap);晃多几下//InitImage();可能就不知道被执行了几次了,
    这样系统资源都被用完,所以立马死了.
      

  9.   

    谢谢楼上几位,但我发现用::DeleteObject之后,我在OnInitDialog调用了InitImage,但一开始时界面显示不出来那些图片,不知道怎么回事? 如如果去掉::DeleteObject就会显示,但却有内存泄露.