120分问一个简单的问题。

chenzhou35 2002-01-17 05:21:57
如何在窗口的客户区画一个16*16的图标。
我用dc.DrawIcon()画这个图标,它自动将其放大成32*32的再画。
我用DrawIconEx()画居然后资源泄露。
不知道是怎么一回事。


#define BUTTON_SIZE 24
#define ICON_SIZE 16
#define Margin 5
void CToolWin::OnPaint()
{
CPaintDC dc(this); // device context for painting
int iTop;
CRect rect;
GetClientRect(rect);

iTop = (rect.Height() - BUTTON_SIZE)/2;

CRect rectButton;
for(int i=0;i<m_image.GetImageCount();i++)
{
rectButton.left = i*BUTTON_SIZE +MARGIN;
rectButton.top = iTop;
rectButton.right = rectButton.left + BUTTON_SIZE;
rectButton.bottom = rectButton.top + BUTTON_SIZE;
HICON hIcon;

//m_image.Create(ICON_SIZE, ICON_SIZE, ILC_COLOR8|ILC_MASK, 0, 1);为CImageList

if(i == iSelectItem && iSelectItem == iOnItem)
{
hIcon = m_image.ExtractIcon(i);
//dc.DrawIcon(0,0,hIcon);无资源泄露,但是自动放大成32*32的。
DrawIconEx(dc.m_hDC,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
{
hIcon = m_image.ExtractIcon(i);
//dc.DrawIcon(0,0,hIcon);
DrawIconEx(dc.m_hDC,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);
}

}

// Do not call CWnd::OnPaint() for painting messages
}
...全文
222 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhou35 2002-01-29
  • 打赏
  • 举报
回复
问题找到了。哎——
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);
0313700000 2002-01-24
  • 打赏
  • 举报
回复
对啊,
chenzhou35 2002-01-24
  • 打赏
  • 举报
回复
upgz
devouer 2002-01-22
  • 打赏
  • 举报
回复
在Draw之前调用SetIcon(hIcon,FALSE);
chenzhou35 2002-01-22
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶
glassshark 2002-01-22
  • 打赏
  • 举报
回复
你如何知道是此处资源泄露,请详述错误描述?及跟踪手法?编译环境?
keisar 2002-01-22
  • 打赏
  • 举报
回复
去www.codeguru.com有一个sample,是将32*32 change 成 16*16的,

参考一下。
chenzhou35 2002-01-22
  • 打赏
  • 举报
回复
再顶。
shibichen 2002-01-22
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶
chenzhou35 2002-01-22
  • 打赏
  • 举报
回复
zmq223 2002-01-21
  • 打赏
  • 举报
回复
我顶
chenzhou35 2002-01-21
  • 打赏
  • 举报
回复
没人回答,难道也没人帮我up一下吗?
请多多帮助。谢谢。
chenzhou35 2002-01-20
  • 打赏
  • 举报
回复
不是吧,居然没人有招吗?
chenzhou35 2002-01-20
  • 打赏
  • 举报
回复
是GDI资源,不是内存,谢谢。
taianproglife 2002-01-20
  • 打赏
  • 举报
回复
查看指针是否都释放了!
chenzhou35 2002-01-20
  • 打赏
  • 举报
回复
麻烦大家继续努力。
chenzhou35 2002-01-18
  • 打赏
  • 举报
回复
这也太笼统了吧。
oicq8 2002-01-18
  • 打赏
  • 举报
回复
www.ourcode.net
chenzhou35 2002-01-18
  • 打赏
  • 举报
回复
请大家多多帮忙。



谢谢whz_time。请到http://www.csdn.net/Expert/topic/486/486689.shtm回贴领分。
whz_time 2002-01-18
  • 打赏
  • 举报
回复
http://www.csdn.net/Expert/topic/484/484265.shtm
加载更多回复(7)

16,472

社区成员

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

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

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