通过位图来创建窗口区域
//此函数通过一张位图来创建一个区域,支持bmp格式和jpg格式//位图中黑色的地方将不透明,非黑色的地方透明,//创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如://setWindowRgn(handle,zjs_createImageRegion(''c:\goomoo.bmp''),true);uses jpeg;function zjs_createImageRegion(imagefile:TFilename):HRGN;varbitmap:TBitmap; //位图对象jpg:TJpegImage;hRegion,hTmpRegion:HRGN; //hRegion: 最终区域 hTmpRegion 临时区域h,l,left,right:integer; //h:行 l:列 left:临时区域的左边 right:临时区域的右边started:Boolean; //是否开始记录ext:String; //图片扩展名beginif not fileExists(imageFile) thenbeginresult:=0;exit; //文件不存在则退出,并返回0end;bitmap:=TBitmap.Create;tryext:=extractFileExt(imageFile);if (ext=''.jpg'') or (ext=''.jpeg'') then //如果是jpg图片beginjpg:=TJpegImage.Create;tryjpg.LoadFromFile(imageFile);bitmap.Assign(jpg); //从Jpg中把位图拷贝过来finallyjpg.Free; //及时释放jpgend;endelse if ext=''.bmp'' thenbitmap.LoadFromFile(imageFile) //载入位图elsebeginresult:=0;exit;end; hRegion:=createRectRgn(0,0,0,0); //创建一个初始的空的区域//初始化变量,消除警告信息left:=0; right:=0;//开始扫描图片的每个像素for h:=0 to bitmap.Height-1 dobeginstarted:=false; for l:=0 to bitmap.Width-1 dobeginif bitmap.Canvas.Pixels[l,h]=clBlack then //黑色为不透明区域,其他颜色为透明区域beginif not started thenbeginstarted:=true; //开始记录右边left:=l; right:=l+1;endelse //startedbeginright:=l;end;endelsebeginif started then //如果已经开始并且该点的颜色不是黑色beginstarted:=false; //结束记录右边hTmpRegion:=createRectRgn(left,h,right,h+1);combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);end;end;end;if started then //到了图片的右边还没有结束beginif right>bitmap.Width-1 then right:=bitmap.Width-1;hTmpRegion:=createRectRgn(left,h,right,h+1);combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);end;end;finallybitmap.Free;end;Result:=hRegion;end;
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论