如何在delphi中根据一副位图实现不规则窗体 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你看看raize(呵呵,都忘了是不是这么写)的source,我记得很早以前用过 不够可以再加分 实在是csdn的搜索不能用了 自己又没有这方面的书其实以前会做的 就是忘记了代码 谁叫“未有淫”啊?~~参考如下文章:http://blog.csdn.net/zswangii/archive/2004/03/25/14318.aspx (*//标题:取得图片的透明区域说明:适用于制作复杂的不规则窗体设计:Zswang支持:[email protected]日期:2004-03-10//*)(*//============================================================================设计思路:~~就是对画布一行一行的扫描~~对于不是透明色相连的像素都看成一条条的线段~~ ───────── ─ ─── ───── ─────── ──── ─────── ─── ─── ── ─────── ── ─────────用这些线段组合成不规则的区域~~线段就是找到开始位置和结束位置就行了~~组合区域是最花时间的地方~~减少组合区域的频率就可以提高运行的速度~~用线段组合就比用点组合少多了~~============================================================================//*)function GraphicToRGN(mGraphic: TGraphic; mTransPoint: TPoint): HRGN;var I, J: Integer; vStart: Integer; vHandle: HRGN; vTransColor: TColor;begin Result := 0; if not Assigned(mGraphic) then Exit; Result := CreateRectRgn(0, 0, 0, 0); with TBitmap.Create do try Width := mGraphic.Width; Height := mGraphic.Height; Canvas.Draw(0, 0, mGraphic); vTransColor := Canvas.Pixels[mTransPoint.X, mTransPoint.Y]; for I := 0 to Height - 1 do begin vStart := 0; for J := 0 to Width do begin if (Canvas.Pixels[J, I] <> vTransColor) and (J < Width) then if vStart < 0 then vStart := J else else if vStart >= 0 then begin vHandle := CreateRectRgn(vStart, I, J, I + 1); try CombineRgn(Result, Result, vHandle, RGN_OR); finally DeleteObject(vHandle); end; vStart := -1; end; end; end; finally Free; end;end; { GraphicToRGN }//Exampleprocedure TForm1.Button1Click(Sender: TObject);var vRGN: HRGN;begin BorderStyle := bsNone; Image1.Left := 0; Image1.Top := 0; vRGN := GraphicToRGN(Image1.Picture.Graphic, Point(0, 0)); try SetWindowRgn(Handle, vRGN, True); finally DeleteObject(vRGN); end;end; 我记得有一个叫SetWindowRgn的函数 Delphi 中如何附加一个SQL sever的 数据库 ? 三维坐标问题 请教:fastreport分页问题 想把本来细类的表组成一个大表,组织编码是个大问题,有没有好的建议 怎样增加TCheckListBox带左面的下拉条和底部的水平拉条的属性? 高分求救。 求DELPHI的编译器函数大全 InstallShield中文版语言包,安装以后生成的安装程序却不能运行 如何判定CHECKLISTBOX是否有两列被选中! 怎样给对象动态数组添加/减少成员? 请问定做一套工资管理系统(单机)要多少钱? 请问如果利用代码关闭 Explorer 这个窗口
其实以前会做的 就是忘记了代码
http://blog.csdn.net/zswangii/archive/2004/03/25/14318.aspx
标题:取得图片的透明区域
说明:适用于制作复杂的不规则窗体
设计:Zswang
支持:[email protected]
日期:2004-03-10
//*)(*//============================================================================
设计思路:~~
就是对画布一行一行的扫描~~
对于不是透明色相连的像素都看成一条条的线段~~
───────── ─ ─── ─────
─────── ──── ───────
─── ─── ── ───────
── ─────────
用这些线段组合成不规则的区域~~
线段就是找到开始位置和结束位置就行了~~
组合区域是最花时间的地方~~
减少组合区域的频率就可以提高运行的速度~~
用线段组合就比用点组合少多了~~
============================================================================//*)function GraphicToRGN(mGraphic: TGraphic; mTransPoint: TPoint): HRGN;
var
I, J: Integer;
vStart: Integer;
vHandle: HRGN;
vTransColor: TColor;
begin
Result := 0;
if not Assigned(mGraphic) then Exit;
Result := CreateRectRgn(0, 0, 0, 0);
with TBitmap.Create do try
Width := mGraphic.Width;
Height := mGraphic.Height;
Canvas.Draw(0, 0, mGraphic);
vTransColor := Canvas.Pixels[mTransPoint.X, mTransPoint.Y];
for I := 0 to Height - 1 do begin
vStart := 0;
for J := 0 to Width do begin
if (Canvas.Pixels[J, I] <> vTransColor) and (J < Width) then
if vStart < 0 then
vStart := J
else
else if vStart >= 0 then begin
vHandle := CreateRectRgn(vStart, I, J, I + 1);
try
CombineRgn(Result, Result, vHandle, RGN_OR);
finally
DeleteObject(vHandle);
end;
vStart := -1;
end;
end;
end;
finally
Free;
end;
end; { GraphicToRGN }//Example
procedure TForm1.Button1Click(Sender: TObject);
var
vRGN: HRGN;
begin
BorderStyle := bsNone;
Image1.Left := 0;
Image1.Top := 0;
vRGN := GraphicToRGN(Image1.Picture.Graphic, Point(0, 0));
try
SetWindowRgn(Handle, vRGN, True);
finally
DeleteObject(vRGN);
end;
end;