C++Builder中不规则窗体的快速显示
ndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height); for(y=0;y<Image1->Height;y++) { lb=true; for(x=0;x<Image1->Width;x++) if(Image1->Canvas->Pixels[x][y]!=clWhite) { a[l].x=x; a[l].y=y; lb=false; break; } if(lb) a[l]=a[l-1]; l++; rb=true; for(x=Image1->Width-1;x>=0;x--) if(Image1->Canvas->Pixels[x][y]!=clWhite) { a[r].x=x; a[r].y=y; rb=false; break; } if(rb) a[r]=a[r+1]; r--; } TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE); CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND); DeleteObject(TempRgn); < free(a); 程序中对每一像素行都从左右两个方向分别扫描,找到两边的分界点存入数组。 不过这个方法也存在一些缺陷,那就是图片的内凹部分轮廓并未表现出来。从下图中可以看出: 最终解决方案 考虑到既不增加算法的复杂度,又可大幅度缩短不规则窗体的创建速度,因此采用综合以上两种方案,达到我们应用的目的,程序中首先应用方法二对图片双向扫描,产生轮廓坐标点数组,然后在图片轮廓内应用方法一将内凹部分抠去,最后才用多边形区域创建函数抠去图片外围部分。程序如下:
至此,一个漂亮的程序界面就出现在你的屏幕上了。 以上程序在Celeron466、WIN98SE和WIN2000、C++ Builder5.0下调试通过。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |