//此函数通过一张位图来创建一个区域,支持bmp格式和jpg格式 //位图中黑色的地方将不透明,非黑色的地方透明, //创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如: //setWindowRgn(handle,zjs_createImageRegion('c:\goomoo.bmp'),true); uses jpeg; function zjs_createImageRegion(imageFile:TFilename):HRGN; var bitmap: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; try ext:=extractFileExt(imageFile); ext:=lowerCase(ext); if (ext='.jpg') or (ext='.jpeg') then //如果是jpg图片 begin jpg:=TJpegImage.Create; try jpg.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; ///////////////////////////////////////////////////////////////////////////////////////////////////////
//完整程序的源代码:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,JPEG;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } procedure ncHitTest(VAR _msg:TMessage);message WM_NCHITTEST; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm} PROCEDURE TFORM1.ncHitTest; BEGIN _MSG.Result:=HTCAPTION; END;//此函数通过一张位图来创建一个区域,支持bmp格式和jpg格式 //位图中黑色的地方将不透明,非黑色的地方透明, //创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如: //setWindowRgn(handle,zjs_createImageRegion('c:\goomoo.bmp'),true);function zjs_createImageRegion(imageFile:TFilename):HRGN; var bitmap: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; try ext:=extractFileExt(imageFile); ext:=lowerCase(ext); if (ext='.jpg') or (ext='.jpeg') then //如果是jpg图片 begin jpg:=TJpegImage.Create; try jpg.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; /////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TForm1.FormCreate(Sender: TObject); var reg:hRGN; begin form1.BorderStyle:=bsNone; REG:=zjs_createImageRegion('c:\mask.bmp'); setWindowRgn(self.Handle,reg,true);
end;procedure TForm1.FormPaint(Sender: TObject); var bmp:TBitmap; begin bmp:=tbitmap.Create; bmp.LoadFromFile('c:\goomoo.bmp'); form1.Canvas.Draw(0,0,bmp); bmp.Free; end;end.
Form1: TForm1;
mpos:tpoint;
ismove:boolean = false;implementation{$R *.dfm}procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
mpos.X:=x;
mpos.Y:=y;
ismove:=true;
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with form1 do
if ismove then
begin
Left := Left - (MPos.X-X);
Top := Top - (MPos.Y-Y);
end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ismove:=false;
end;end.
A:d6/d7 直接在窗体里就可以设置,具体名字给忘了,就有ABC开头的区。D5需要一个WIN2K的控件
[email protected]
//位图中黑色的地方将不透明,非黑色的地方透明,
//创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如:
//setWindowRgn(handle,zjs_createImageRegion('c:\goomoo.bmp'),true);
uses jpeg;
function zjs_createImageRegion(imageFile:TFilename):HRGN;
var
bitmap: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;
try
ext:=extractFileExt(imageFile); ext:=lowerCase(ext);
if (ext='.jpg') or (ext='.jpeg') then //如果是jpg图片
begin
jpg:=TJpegImage.Create;
try
jpg.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;
///////////////////////////////////////////////////////////////////////////////////////////////////////
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,JPEG;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
procedure ncHitTest(VAR _msg:TMessage);message WM_NCHITTEST;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
PROCEDURE TFORM1.ncHitTest;
BEGIN
_MSG.Result:=HTCAPTION;
END;//此函数通过一张位图来创建一个区域,支持bmp格式和jpg格式
//位图中黑色的地方将不透明,非黑色的地方透明,
//创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如:
//setWindowRgn(handle,zjs_createImageRegion('c:\goomoo.bmp'),true);function zjs_createImageRegion(imageFile:TFilename):HRGN;
var
bitmap: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;
try
ext:=extractFileExt(imageFile); ext:=lowerCase(ext);
if (ext='.jpg') or (ext='.jpeg') then //如果是jpg图片
begin
jpg:=TJpegImage.Create;
try
jpg.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;
///////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
var
reg:hRGN;
begin
form1.BorderStyle:=bsNone;
REG:=zjs_createImageRegion('c:\mask.bmp');
setWindowRgn(self.Handle,reg,true);
end;procedure TForm1.FormPaint(Sender: TObject);
var
bmp:TBitmap;
begin
bmp:=tbitmap.Create;
bmp.LoadFromFile('c:\goomoo.bmp');
form1.Canvas.Draw(0,0,bmp);
bmp.Free;
end;end.