How are you detecting the leak?
I do not select the brush into the DC prior to calling FrameRect() and do not get a GDI leak.
If you look at the code MFC uses to draw you will see it used that way as well.
ie from VC98\MFC\SRC\PPGCOLOR.CPP
Code:
void _AfxDraw3DButtonFrame(CDC *pDC, CRect rcButton, BOOL fFocus)
{
CPen *pPen, *pOldPen;
CBrush GrayBrush(RGB_BUTTON_LIGHT);
CBrush BlackBrush(RGB_BUTTON_BLACK);
pPen = new CPen(PS_SOLID, 1, RGB_BUTTON_BLACK);
pOldPen = pDC->SelectObject(pPen);
// Draw gray outside
pDC->FrameRect(&rcButton, &GrayBrush);
rcButton.InflateRect(-1, -1);
if (fFocus)
{
// Draw inside of border
pDC->FrameRect(&rcButton, &BlackBrush);
// Draw curved border on outside;
rcButton.InflateRect(1, 1);
}
else
{
// Prepare inside border
pDC->FrameRect(&rcButton, &GrayBrush);
}
pDC->MoveTo(rcButton.left+1, rcButton.top);
pDC->LineTo(rcButton.right-1, rcButton.top);
pDC->MoveTo(rcButton.left+1, rcButton.bottom-1);
pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
pDC->MoveTo(rcButton.left, rcButton.top+1);
pDC->LineTo(rcButton.left, rcButton.bottom-1);
pDC->MoveTo(rcButton.right-1, rcButton.top+1);
pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
pDC->SelectObject(pOldPen);
delete pPen;
}