120分问一个简单的问题。
如何在窗口的客户区画一个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
}