Delphi知识中心
www.delphi.ee
提供Delphi技术知识
与Delphi程序员共同进步


在线服务QQ:99923144 随时恭候您的光临
首页 基础知识 WIN系统 组件使用 组件开发 数据库 ACTIVEX 多媒体技术 网络技术 关于
文章类别:WIN系统    你尚未登陆,会员功能无法使用,请从 网站首页 登陆。
  通过位图来创建窗口区域  
 

//此函数通过一张位图来创建一个区域,支持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;
//图片扩展名
begin
if not fileExists(imageFile) then
begin
result:=0;
exit; //文件不存在则退出,并返回0
end;
bitmap:=TBitmap.Create;
tryext:=extractFileExt(imageFile);
if (ext=''.jpg'') or (ext=''.jpeg'') then //如果是jpg图片

begin
jpg:=TJpegImage.Create;
tryjpg.LoadFromFile(imageFile);
bitmap.Assign(jpg);
//从Jpg中把位图拷贝过来
finally
jpg.Free; //及时释放jpg
end;
end else if ext=''.bmp'' then
bitmap.LoadFromFile(imageFile) //载入位图
else begin
result:=0;
exit;
end;
hRegion:=createRectRgn(0,0,0,0);
//创建一个初始的空的区域
//初始化变量,消除警告信息
left:=0; right:=0;//开始扫描图片的每个像素
for h:=0 to bitmap.Height-1 do begin
started:=false;
for l:=0 to bitmap.Width-1 do begin
if bitmap.Canvas.Pixels[l,h]=clBlack then //黑色为不透明区域,其他颜色为透明区域

begin if not started then begin
started:=true; //开始记录右边
left:=l; right:=l+1;
end else //started begin right:=l;
end;
end else begin
if started then
//如果已经开始并且该点的颜色不是黑色
begin
started:=false; //结束记录右边
hTmpRegion:=createRectRgn(left,h,right,h+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
end;
end;
end;
if started then //到了图片的右边还没有结束
begin if right>bitmap.Width-1 then
right:=bitmap.Width-1;
hTmpRegion:=createRectRgn(left,h,right,h+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
end;
end;finally
bitmap.Free;
end;
Result:=hRegion;
end;

 

在线服务QQ:99923144 Delphi程序员QQ群(139442)
Delphi知识中心 www.delphi.ee 最专业的Delphi技术资料网站