mfc创建不规则窗口

来源:互联网 发布:淘宝 ac68u 洋垃圾 编辑:程序博客网 时间:2024/04/28 20:30
void CSocketPhoneDlg::CreateRgnWindow(){CString path;GetAppPath(path);CImage img;img.Load(path+"\\src\\image\\img_backgroundMask.png");COLORREF transColor=img.GetPixel(0,0);//不显示的颜色if(img.GetBPP()==32){//确认该图像包含Alpha通道   for(int i=0;i<img.GetWidth();i++)for(int j=0;j<img.GetHeight();j++){LPBYTE by=(LPBYTE)img.GetPixelAddress(i,j);by[0]=by[0]*by[3]/255;by[1]=by[1]*by[3]/255;by[2]=by[2]*by[3]/255;}transColor=img.GetPixel(0,0);//不显示的颜色}CBitmap bmp;bmp.Attach(img);BITMAP bit;bmp.GetBitmap(&bit);//兼容DCCClientDC dc(this);CDC memDC;memDC.CreateCompatibleDC(&dc);CRgn rgn;rgn.CreateRectRgn(0,0,0,0);//先创建空的region CBitmap *oldBmp=memDC.SelectObject(&bmp);//最后还原对象for(int y=0;y<bit.bmHeight;y++){CRgn t;//保存临时region int x=0;do{while(x<bit.bmWidth&&memDC.GetPixel(x,y)==transColor)x++;//此点是要透明的点,寻找要显示的点int k=x;//记住这个起始点while(x<bit.bmWidth&&memDC.GetPixel(x,y)!=transColor)x++;//此点是要显示的点,跳过t.CreateRectRgn(k,y,x,y+1);//创建一个包含起点与重点间高为1像素的临时矩形“region”rgn.CombineRgn(&rgn,&t,RGN_OR);////合并到主"region" .RGN_OR,即两”region”全部合并去处重复部分t.DeleteObject();//删除临时"region",否则下次创建时和出错}while(x<bit.bmWidth);}//设置窗体大小CRect rc;this->GetWindowRect(&rc);rc.right=rc.left+img.GetWidth();rc.bottom=rc.top+img.GetHeight();this->MoveWindow(&rc);//裁剪窗体if(oldBmp)memDC.SelectObject(bmp);CWnd* pWnd=dc.GetWindow();pWnd->SetWindowRgn(rgn,true);//pWnd->SetForegroundWindow();}
http://download.csdn.net/detail/q775968375/5988813
原创粉丝点击