mfc创建不规则窗口

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值