procedure TForm1.Button1Click(Sender: TObject); var region:THandle; function CreateBitmapRgn(Bitmap: TBitmap; TransparentColor: TColor): HRgn; var BitmapMask: TBitmap; RectList: TList; RgnData: PRgnData; I, Size: Integer; Rects: PRect; procedure FindRegionRectangles; var Mask: Byte; B: PByteArray; X, Y, Left, Right: Integer; ScanlineBytes, I: Integer; PR: PRect; begin B := BitmapMask.Scanline[0]; ScanlineBytes := Integer(BitmapMask.Scanline[1]) - Integer(B); for Y := 0 to BitmapMask.Height-1 do begin Left := 0; Right := -1; I := 0; Mask := $80; for X := 0 to BitmapMask.Width-1 do begin if (Mask and B[I]) <> 0 then begin if Right >= Left then begin New(PR); PR^.Left := Left; PR^.Top := Y; PR^.Right := Right+1; PR^.Bottom := Y+1; RectList.Add(PR); end; Left := Right+2; end; Inc(Right); Mask := Mask shr 1; if Mask = 0 then begin Inc(I); Mask := $80; end; end; if Right >= Left then begin New(PR); PR^.Left := Left; PR^.Top := Y; PR^.Right := Right+1; PR^.Bottom := Y+1; RectList.Add(PR); end; Inc(Integer(B), ScanlineBytes); end; end; begin RectList := TList.Create; BitmapMask := TBitmap.Create; try BitmapMask.Assign(Bitmap); BitmapMask.Mask(TransparentColor); BitmapMask.PixelFormat := pf1bit; FindRegionRectangles; Size := SizeOf(TRgnData) + (RectList.Count * SizeOf(TRect)); GetMem(RgnData, Size); try with RgnData^.rdh do begin dwSize := SizeOf(TRgnDataHeader); iType := RDH_RECTANGLES; nCount := RectList.Count; nRgnSize := SizeOf(TRect); rcBound := Rect(0, 0, Bitmap.Width-1, Bitmap.Height-1); end; Rects := PRect(@RgnData^.Buffer); for I := 0 to RectList.Count-1 do begin Rects^ := PRect(RectList.Items[I])^; Dispose(PRect(RectList.Items[I])); Inc(Rects); end; Result := ExtCreateRegion(nil, Size, RgnData^) finally FreeMem(RgnData, Size); end; finally BitmapMask.Free; RectList.Free; end; end; begin region:=CreateBitmapRgn(Image1.Picture.Bitmap,clBlack); SetWindowRgn(窗口句柄,region,True); end;
如果你的窗体上已经放了一个image来显示png图。那么再加入下面代码即可:procedure TForm1.FormCreate(Sender: TObject); begin Color:=15; TransparentColorValue:=Color; TransparentColor:=true; end;如果不需要标题栏,只需要设置 self.BorderStyle:=bsNone; 即可。
var region:THandle;
function CreateBitmapRgn(Bitmap: TBitmap; TransparentColor: TColor): HRgn;
var
BitmapMask: TBitmap;
RectList: TList;
RgnData: PRgnData;
I, Size: Integer;
Rects: PRect;
procedure FindRegionRectangles;
var
Mask: Byte;
B: PByteArray;
X, Y, Left, Right: Integer;
ScanlineBytes, I: Integer;
PR: PRect;
begin
B := BitmapMask.Scanline[0];
ScanlineBytes := Integer(BitmapMask.Scanline[1]) - Integer(B);
for Y := 0 to BitmapMask.Height-1 do
begin
Left := 0;
Right := -1;
I := 0;
Mask := $80;
for X := 0 to BitmapMask.Width-1 do
begin
if (Mask and B[I]) <> 0 then
begin
if Right >= Left then
begin
New(PR);
PR^.Left := Left;
PR^.Top := Y;
PR^.Right := Right+1;
PR^.Bottom := Y+1;
RectList.Add(PR);
end;
Left := Right+2;
end;
Inc(Right);
Mask := Mask shr 1;
if Mask = 0 then
begin
Inc(I);
Mask := $80;
end;
end;
if Right >= Left then
begin
New(PR);
PR^.Left := Left;
PR^.Top := Y;
PR^.Right := Right+1;
PR^.Bottom := Y+1;
RectList.Add(PR);
end;
Inc(Integer(B), ScanlineBytes);
end;
end;
begin
RectList := TList.Create;
BitmapMask := TBitmap.Create;
try
BitmapMask.Assign(Bitmap);
BitmapMask.Mask(TransparentColor);
BitmapMask.PixelFormat := pf1bit;
FindRegionRectangles;
Size := SizeOf(TRgnData) + (RectList.Count * SizeOf(TRect));
GetMem(RgnData, Size);
try
with RgnData^.rdh do
begin
dwSize := SizeOf(TRgnDataHeader);
iType := RDH_RECTANGLES;
nCount := RectList.Count;
nRgnSize := SizeOf(TRect);
rcBound := Rect(0, 0, Bitmap.Width-1, Bitmap.Height-1);
end;
Rects := PRect(@RgnData^.Buffer);
for I := 0 to RectList.Count-1 do
begin
Rects^ := PRect(RectList.Items[I])^;
Dispose(PRect(RectList.Items[I]));
Inc(Rects);
end;
Result := ExtCreateRegion(nil, Size, RgnData^)
finally
FreeMem(RgnData, Size);
end;
finally
BitmapMask.Free;
RectList.Free;
end;
end;
begin
region:=CreateBitmapRgn(Image1.Picture.Bitmap,clBlack);
SetWindowRgn(窗口句柄,region,True);
end;
begin
Color:=15;
TransparentColorValue:=Color;
TransparentColor:=true;
end;如果不需要标题栏,只需要设置
self.BorderStyle:=bsNone;
即可。
兄弟啊,你不会自己改改啊,写代码不是只有ctrl+C ctrl+V