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

来源:互联网 发布:多核cpu工作原理 知乎 编辑:程序博客网 时间:2024/05/01 09:49

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


 

原创粉丝点击