vc++根据图片定制不规则窗口

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、最终效果图:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值