你如果习惯用GDI的API函数的话,可能比较容易,用BitBlt去画。

解决方案 »

  1.   

    建议如下修改:
    hIcon = m_image.ExtractIcon(i);
    if(i == iSelectItem && iSelectItem == iOnItem)
    {
                              //dc.DrawIcon(0,0,hIcon);无资源泄露,但是自动放大成32*32的。
    DrawIconEx(dc.GetSafeHdc(),rectButton.left+(BUTTON_SIZE - ICON_SIZE)/2+1,rectButton.top + (BUTTON_SIZE - ICON_SIZE)/2 + 1,hIcon,ICON_SIZE,ICON_SIZE,0,NULL,DI_NORMAL);
    dc.Draw3dRect(rectButton,RGB(128,128,128),RGB(255,255,255));
    ::DestroyIcon(hIcon);
    }
    else
    {
    //dc.DrawIcon(0,0,hIcon);
    DrawIconEx(dc.GetSafeHdc(),rectButton.left+(BUTTON_SIZE - ICON_SIZE)/2,rectButton.top + (BUTTON_SIZE - ICON_SIZE)/2,m_image.ExtractIcon(i),ICON_SIZE,ICON_SIZE,0,NULL,DI_NORMAL);
    if(iSelectItem == -1 && iOnItem == i)
    dc.Draw3dRect(rectButton,RGB(255,255,255),RGB(128,128,128));
    }
    ::DestroyIcon(hIcon);
      

  2.   

    http://www.csdn.net/Expert/topic/484/484265.shtm
      

  3.   

    请大家多多帮忙。谢谢whz_time。请到http://www.csdn.net/Expert/topic/486/486689.shtm回贴领分。
      

  4.   

    是GDI资源,不是内存,谢谢。
      

  5.   

    在Draw之前调用SetIcon(hIcon,FALSE);
      

  6.   

    去www.codeguru.com有一个sample,是将32*32 change 成 16*16的,参考一下。
      

  7.   

    问题找到了。哎——
    DrawIconEx(dc.GetSafeHdc(),rectButton.left+(BUTTON_SIZE - ICON_SIZE)/2,rectButton.top + (BUTTON_SIZE - ICON_SIZE)/2, ######看这里,不泄露才怪呢m_image.ExtractIcon(i)换成hIcon一切OK#########,ICON_SIZE,ICON_SIZE,0,NULL,DI_NORMAL);