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);
//兼容DC
CClientDC 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
mfc创建不规则窗口
最新推荐文章于 2024-08-30 12:14:10 发布