void CButtonST::SetIcon(int nIconInId, int nIconOutId)
{
HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),
RT_GROUP_ICON);
// Set icon when the mouse is IN the button
m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  
// Set icon when the mouse is OUT the button
m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
RedrawWindow();第二段程序也出现泄漏
void CGeneralDlg::DrawColor(bool isOn, int IDBtn)
{
HINSTANCE hInstance;
HBITMAP hBitmap;
hInstance = ::AfxGetInstanceHandle();
hBitmap = ::LoadBitmap(hInstance,isOn?"ONU":"OND");
((CButton *)GetDlgItem(IDBtn))->SetBitmap(hBitmap);
}
}

解决方案 »

  1.   

    When you are finished using a bitmap, cursor, or icon you loaded without specifying the LR_SHARED flag, you can release its associated memory by calling one of the functions in the following table. Resource        Release function 
    Bitmap          DeleteObject 
    Cursor          DestroyCursor 
    Icon            DestroyIcon 
      

  2.   

    我把第二段代码的函数放在OnTimer里面循环调用,超过2,3分钟,程序就挂掉了。在OnTimer里面不再调这个函数,就不会出任何问题了
      

  3.   

    void CGeneralDlg::DrawColor(bool isOn, int IDBtn)
    {
    HINSTANCE hInstance;
    HBITMAP hBitmap;
    hInstance = ::AfxGetInstanceHandle();
    hBitmap = ::LoadBitmap(hInstance,isOn?"ONU":"OND");
    ((CButton *)GetDlgItem(IDBtn))->SetBitmap(hBitmap);
             DeleteObject(hBitmap);
    }
      

  4.   

    你的第二段代码为什么,
    不在CGeneralDlg类里面加入两个CBitmap类,初始化的时候就加载两个图片:OnInitDialog:
    {
    m_bmpOn.LoadBitmap("ONU");
    m_bmpOff.LoadBitmap("OND");}
    void CGeneralDlg::DrawColor(bool isOn, int IDBtn)
    {
    ((CButton *)GetDlgItem(IDBtn))->SetBitmap(isOn?(HBITMAP)m_bmpOn:(HBITMAP)m_bmpOff);
    }
      

  5.   

    to:happyparrot(为何我买彩票从来不中奖?没钱怎么办阿?) 
    我已经加了DeleteObject(hBitmap),但是程序不现实位图了
      

  6.   

    hBitmap = ::LoadBitmap(hInstance,isOn?"ONU":"OND");这个hBitmap用完了要删掉,否则程序会越来越慢,然后崩溃。
      

  7.   

    回复人: phoenix96_2000(eXMe) ( ) 信誉:95  2005-09-07 15:57:00  得分: 0  
     
     
       你的第二段代码为什么,
    不在CGeneralDlg类里面加入两个CBitmap类,初始化的时候就加载两个图片:OnInitDialog:
    {
    m_bmpOn.LoadBitmap("ONU");
    m_bmpOff.LoadBitmap("OND");}
    void CGeneralDlg::DrawColor(bool isOn, int IDBtn)
    {
    ((CButton *)GetDlgItem(IDBtn))->SetBitmap(isOn?(HBITMAP)m_bmpOn:(HBITMAP)m_bmpOff);
    }  
    ====同意,做成成员变量。反正就是两个位图罢了。
      

  8.   


    HBITMAP hBitmapOld = ((CButton *)GetDlgItem(IDBtn))->SetBitmap(hBitmap);
             if (hBitmapOld)
                 ::DeleteObject(hBitmapOld);