BOOL CFlatDlg::SetWindowRgnByBk()
{
CRgn rgn;
CRect rc;
CDC dcImage;
CBitmap *pOldBitmap;
int nWidth;
int nHeight;
BITMAP bm;
int row_start;
int x, y;
CRgn SubRgn;
HANDLE hDib;
BYTE * pData;
BYTE * pCurData;
int nOneLineByte;
COLORREF CurCor;
int nHeightDlt;
// GetClientRect(rc);
rgn.CreateRectRgn(0, 0, 0, 0);
dcImage.CreateCompatibleDC (NULL);
pOldBitmap = dcImage.SelectObject(&m_DlgBk);
m_DlgBk.GetBitmap(&bm);
nWidth = bm.bmWidth;
nHeight = bm.bmHeight;
hDib = DDBToDIB(m_DlgBk, NULL, NULL, 32);
pData = (BYTE *)hDib + sizeof(BITMAPINFOHEADER);
nOneLineByte = nWidth * 4;
// DWORD t1 = GetTickCount();
for(y=0; y<nHeight; y++)
{
row_start = 0;
nHeightDlt = nOneLineByte * (nHeight-y-1);
for(x=0; x<nWidth; x++)
{
#if 1
pCurData = pData + nHeightDlt + x*4;
CurCor = *(COLORREF *)pCurData;
#else
CurCor = dcImage.GetPixel(x, y);
#endif
if (CurCor != col_trasparant)
continue;
if(row_start == x)
{
row_start ++;
}
else
{
SubRgn.CreateRectRgn(row_start, y, x, y+1);
rgn.CombineRgn(&rgn, &SubRgn, RGN_OR);
SubRgn.DeleteObject();
row_start = x+1;
}
}
if (row_start == x)
continue;
SubRgn.CreateRectRgn(row_start, y,x, y+1);
rgn.CombineRgn(&rgn, &SubRgn, RGN_OR);
SubRgn.DeleteObject();
}
GlobalFree(hDib);
// t1 = GetTickCount() - t1;
SetWindowRgn(rgn, TRUE);
dcImage.SelectObject(pOldBitmap);
dcImage.DeleteDC();
return TRUE;
}
#if 1
pCurData = pData + nHeightDlt + x*4;
CurCor = *(COLORREF *)pCurData;
#else
CurCor = dcImage.GetPixel(x, y);
#endif
速度从 1000 -> 15