1、根据图片生产不规则区域
void CMyDlg::SetupRegion(CDC *pDC, UINT BackBitmapID, UINT MaskBitmapID, COLORREF TransColor)
{
//根据图片,生成窗口
CDC memDC;
CBitmap cBitmap;
CBitmap *pOldMemBmp=NULL;
COLORREF col;
CRect cRect;
int x,y;
CRgn wndRgn,rgnTemp;
BITMAP bmpInfo;
//取得窗口大小
GetWindowRect(&cRect);
//装载模板位图
cBitmap.LoadBitmap(MaskBitmapID);
cBitmap.GetBitmap(&bmpInfo);
cRect.right=cRect.left+bmpInfo.bmWidth;
cRect.bottom=cRect.top+bmpInfo.bmHeight;
m_rect=cRect; //m_rect为全局变量,用于窗口重绘
memDC.CreateCompatibleDC(pDC);
pOldMemBmp=memDC.SelectObject(&cBitmap);
//首先创建默认的完整区域为完整的对话框窗口区域
wndRgn.CreateRectRgn(0,0,cRect.Width(),cRect.Height());
//下面2层循环为检查背景位图象素颜色,当象素颜色为指定的透明颜色时,将
//该点从区域中裁掉
for (x=0;x<=cRect.Width();++x)
{
for (y=0;y<=cRect.Height();++y)
{
col=memDC.GetPixel(x,y);
if (col==TransColor)
{
//象素颜色为指定的透明颜色,创建透明的微区域
rgnTemp.CreateRectRgn(x,y,x+1,y+1);
//从完整的区域中裁掉透明的微区域
wndRgn.CombineRgn(&wndRgn,&rgnTemp,RGN_XOR);
rgnTemp.DeleteObject();
}
}
}
if (pOldMemBmp)
{
memDC.SelectObject(pOldMemBmp);
}
//指定窗口为显示的区域,并擦出窗口重绘
SetWindowRgn((HRGN)wndRgn,TRUE);
}
2、给窗体贴背景
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// TODO: Add your message handler code here and/or call default
CRect rect=m_rect;
CBitmap m_pBmp;
BITMAP bm;
CDC dcMem;
m_pBmp.LoadBitmap(IDB_BITMAPMAIN);
m_pBmp.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);
pDC->SetStretchBltMode(COLORONCOLOR);
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
return TRUE;
}
3、调用: 在对话框初始化的时候调用
4、缺点: 这种方法因为要进行大量的计算,所以比较耗费时间,对话框初始化时间较长
5、最终效果图: