Delphi中,如何使用Png等透明格式图片还做 Form的形状 20
如题,在Delphi中该如何使用图片来做窗口的形状呢,最好就是可以支持Gif或是png等透明格式的图片,因bmp图片再去掉指定颜色的话,边缘会不圆滑。直接支持让PNG或是...
如题,在Delphi中该如何使用图片来做窗口的形状呢,最好就是可以支持 Gif 或是 png等透明格式的图片,因bmp
图片 再去掉指定颜色的话,边缘会不圆滑。
直接支持让
PNG或是GIF等透明的图片格式来做成窗口的形状,这样就应该不会有锯齿出现的!也就是说,透明图片做成什么样
,Form就可以较完美的只显示出此图片的形状,,,并能在上面添加其它控件,可拖动
请问一下应该怎么做,或是有什么第三方控件可以直接指定透明格式图片做为窗口形状的,谢谢 展开
图片 再去掉指定颜色的话,边缘会不圆滑。
直接支持让
PNG或是GIF等透明的图片格式来做成窗口的形状,这样就应该不会有锯齿出现的!也就是说,透明图片做成什么样
,Form就可以较完美的只显示出此图片的形状,,,并能在上面添加其它控件,可拖动
请问一下应该怎么做,或是有什么第三方控件可以直接指定透明格式图片做为窗口形状的,谢谢 展开
展开全部
Raize_4.3.2组件包含有这样的控件,可以直接使用控件--RzFormShape
或者重新绘制:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons;
private
function CreateRegion(wMask: TBitmap; wColor: TColor;
hControl: THandle): HRGN;
function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl); //取得窗口的DC
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);//开始绘制
for x:=0 to wMask.Width-1 do //设定窗体的大小和形状
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);//结束绘制
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc); //释放DC
Result := rgn;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
begin
w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);//取得图片对象
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);//生成窗体区域
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);//设定窗体形状
end;
w1.Free;
end;
或者重新绘制:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons;
private
function CreateRegion(wMask: TBitmap; wColor: TColor;
hControl: THandle): HRGN;
function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl); //取得窗口的DC
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);//开始绘制
for x:=0 to wMask.Width-1 do //设定窗体的大小和形状
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);//结束绘制
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc); //释放DC
Result := rgn;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
begin
w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);//取得图片对象
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);//生成窗体区域
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);//设定窗体形状
end;
w1.Free;
end;
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
展开全部
Raize_4.3.2组件包含有这样的控件,可以直接使用控件--RzFormShape
追问
Raize 的 Rzformshape 加透明的png图片, 背景还是会出现,如果不是这样的话,我早就使用raize了
追答
那这个重新绘制可以吧
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons;
private
function CreateRegion(wMask: TBitmap; wColor: TColor;
hControl: THandle): HRGN;
function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl); //取得窗口的DC
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);//开始绘制
for x:=0 to wMask.Width-1 do //设定窗体的大小和形状
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);//结束绘制
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc); //释放DC
Result := rgn;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
begin
w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);//取得图片对象
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);//生成窗体区域
if rgn0 then
begin
SetWindowRgn(Handle, rgn, true);//设定窗体形状
end;
w1.Free;
end;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
D2007以前的,所谓的支持是假象,你可以设计在运行时直接加载png到Btn试试看.
至於设计时的支持,那是因为有PropertyEditor的处理,我估计属性编辑对png的图片做了转换,就这样而已
至於设计时的支持,那是因为有PropertyEditor的处理,我估计属性编辑对png的图片做了转换,就这样而已
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询