请问一个关于按钮重绘的有关问题,求高人解答

请教一个关于按钮重绘的问题,急求高人解答
最近开始做界面美化的东西,关于按钮美化这个,方法蛮多的,但是最终实现的都不够理想,所以特来请教一下.

要求:利用.BMP或者.ICO来对按钮进行美化,按钮要求是圆形的,或者是和图标文件一样的不规则形.并支持热点效果.点击以后按钮变成另外一个样子,再次点击变回来.

方法1:用setico或者setbitmap直接添加位图和图标.

位图文件圆形的话会有白色背景,图标文件倒是是圆形的,但是如果直接添加话,不能完整的显示圆形,他是以那个按钮的方形进行计算大小的,按钮太小,图标文件显示不全,按钮大了,会有一圈按钮的边框.

方法2:重绘按钮

建立一个CBUTTON的继承类,在类里重载DrawItem函数,这个方法应该是用的最多的,也能实现热点效果等功能,但是我查到的资料里重绘只能用bmp文件去重绘,bmp是方形的图,如果显示圆形还是会有白色的底.我想了下也许可以先把按钮重绘成圆形的,再往里边添加位图文件,但是这样做貌似有些麻烦.我想知道有没有办法可以用图标文件进行重绘.

或者各位大神你们在对按钮进行美化的时候是怎么做的?望各位大神不吝赐教,小弟不胜感激.

按钮 重绘 图标 位图

------解决方案--------------------
搜一下CButtonST
------解决方案--------------------
记得以前一般重载 OnPaint() 函数。 
------解决方案--------------------
//circle
CRgn rg;
rg.CreateEllipticRgn(0,0,CIRCLE_DIA,CIRCLE_DIA);
pBn[m_iBn]->SetWindowRgn(rg,TRUE);// 按钮s
// 画时:

RECT rect = lpDS->rcItem;
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom); 
int ret=::GetWindowRgn(lpDS->hwndItem,rgn);
//afxDump << ret << "=Get\n";// 3=COMPLEXREGION; ERROR=0
if(ret) 
dc.FillRgn(&rgn,&CBrush(color));
else
dc.FillRect(&rect,&CBrush(color));