1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn

MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn

时间:2019-11-25 15:13:42

相关推荐

MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn

Windows中所有窗口显示默认为矩形,很多时候我们希望窗口的形状可以随意变化。这个时候我们就需要使用MFC的CRgn类,

每一个窗口都有一个自己的CRgn,定义了当前窗口的显示区域,CRgn就好像是在一张图片上添加了相框,相框的形状就决定了

窗口的显示范围。当然显示区域之外就属于其他窗口。

一,多边形窗口

CRect rc; GetWindowRect(&rc); //获取窗口矩形(大小)CPoint ptVertex[4]; //多边形顶点数组,形状为平行四边形ptVertex[0].x = 0 ; ptVertex[0].y = rc.Height();ptVertex[1].x = rc.Width()/2;ptVertex[1].y = rc.Height();ptVertex[2].x = rc.Width();ptVertex[2].y =0;ptVertex[3].x = rc.Width()/2;ptVertex[3].y = 0;CRgn m_rgn; //定义窗口显示区域m_rgn.CreatePolygonRgn(ptVertex,4,ALTERNATE);//根据顶点数组创建窗口的显示区域SetWindowRgn(m_rgn,TRUE);//添加到当前窗口

代码直接放在OnInitDialog()方法里,修改顶点就可以了,其中第一个点和最后一个点会自动连接。

二,根据图片定义窗口

COLORREF TransColor=RGB(255,255,255);//白色为不显示的部分CBitmap cBitmap;cBitmap.LoadBitmap(IDB_BITMAP_CRGN);//加载描述窗口形状的BMP图片CDC* pDC=this->GetDC();CDC memDC;//为什么要创建,是不是可以直接设置当前控件的CRgnmemDC.CreateCompatibleDC(pDC);//创建与传入DC兼容的临时DCCBitmap *pOldMemBmp=NULL;pOldMemBmp=memDC.SelectObject(&cBitmap);//将位图选入临时DC,方便对图片在控件环境中进行操作static CRgn wndRgn;wndRgn.CreateRectRgn(0,0,0,0);//创建总的窗体区域,初始region为0BITMAP bit;cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽int y;CRgn rgnTemp; //保存临时regionfor(y=0;y<=bit.bmHeight ;y++){int iX = 0;do{//跳过透明色找到下一个非透明色的点.while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)iX++;//记住这个起始点int iLeftX = iX;//寻找下个透明色的点while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)++iX;//创建一个包含起点与重点间高为1像素的临时“region”rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);//合并到主"region".bineRgn(&wndRgn, &rgnTemp, RGN_OR);//删除临时"region",否则下次创建时和出错rgnTemp.DeleteObject();}while(iX<bit.bmWidth);}this->SetWindowRgn(wndRgn,TRUE);memDC.DeleteDC();

代码直接放在OnInitDialog()方法里,修改要载入的图片就可以了,图片可以是24位也可以是32位。

我的图片:

程序窗口:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。