请高人帮小弟我看段代码,求解释下,这是公司的人写的几段代码(求注释)

请高人帮我看段代码,求解释下,这是公司的人写的几段代码(求注释)
本帖最后由 VisualEleven 于 2014-03-20 13:21:47 编辑
HRGN CxSkinButton::CreateRgnFromBitmap(HBITMAP hBmp, COLORREF color)
{
if(hBmp) return NULL;

BITMAP bm;
GetObject(hBmp,sizeof(BITMAP),&bm);//获取位图信息

CDC dcBmp;
dcBmp.CreateCompatibleDC(GetDC());//创建一个内存DC
dcBmp.SelectObject(hBmp);

const DWORD RDHDR = sizeof(RGNDATAHEADER);//保存矩形区域的信息参见GetRegionData
const DWORD MAXBUF = 40;

LPRECT pRects;
DWORD  cBlocks=0;//分配的块

int i,j;//在mask图片中当前的位置
int first = 0;//当前扫描线,左边的位置

bool wasfirst = false;
bool ismask;

//为矩形区域信息分配内存
RGNDATAHEADER* pRgnData = (RGNDATAHEADER*)new BYTE[ RDHDR + ++cBlocks * MAXBUF * sizeof(RECT) ];
memset( pRgnData, 0, RDHDR + cBlocks * MAXBUF * sizeof(RECT) );


pRgnData->dwSize = RDHDR;
pRgnData->iType = RDH_RECTANGLES;
pRgnData->nCount = 0;
for ( i = 0; i < bm.bmHeight; i++ )
for ( j = 0; j < bm.bmWidth; j++ ){

ismask=(dcBmp.GetPixel(j,bm.bmHeight-i-1)!=color);

if (wasfirst && ((ismask && (j==(bm.bmWidth-1)))||(ismask ^ (j<bm.bmWidth)))){

pRects = (LPRECT)((LPBYTE)pRgnData + RDHDR);

pRects[ pRgnData->nCount++ ] = CRect( first, bm.bmHeight - i - 1, j+(j==(bm.bmWidth-1)), bm.bmHeight - i );

if ( pRgnData->nCount >= cBlocks * MAXBUF ){
LPBYTE pRgnDataNew = new BYTE[ RDHDR + ++cBlocks * MAXBUF * sizeof(RECT) ];
memcpy( pRgnDataNew, pRgnData, RDHDR + (cBlocks - 1) * MAXBUF * sizeof(RECT) );
delete pRgnData;
pRgnData = (RGNDATAHEADER*)pRgnDataNew;
}
wasfirst = false;
} else if ( !wasfirst && ismask ){
first = j;
wasfirst = true;
}
}
dcBmp.DeleteDC();

HRGN hRgn=CreateRectRgn(0, 0, 0, 0);
ASSERT( hRgn!=NULL );
pRects = (LPRECT)((LPBYTE)pRgnData + RDHDR);
for(i=0;i<(int)pRgnData->nCount;i++)
{
HRGN hr=CreateRectRgn(pRects[i].left, pRects[i].top, pRects[i].right, pRects[i].bottom);
VERIFY(CombineRgn(hRgn, hRgn, hr, RGN_OR)!=ERROR);
if (hr) DeleteObject(hr);
}
ASSERT( hRgn!=NULL );


delete pRgnData;
return hRgn;
}

------解决方案--------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

------解决方案--------------------
顶起~!!!!!!!!!!!!!!!!!!!!!!!!!!!