Delphi中,如何使用Png等透明格式图片还做 Form的形状 20

如题,在Delphi中该如何使用图片来做窗口的形状呢,最好就是可以支持Gif或是png等透明格式的图片,因bmp图片再去掉指定颜色的话,边缘会不圆滑。直接支持让PNG或是... 如题,在Delphi中该如何使用图片来做窗口的形状呢,最好就是可以支持 Gif 或是 png等透明格式的图片,因bmp

图片 再去掉指定颜色的话,边缘会不圆滑。

直接支持让
PNG或是GIF等透明的图片格式来做成窗口的形状,这样就应该不会有锯齿出现的!也就是说,透明图片做成什么样

,Form就可以较完美的只显示出此图片的形状,,,并能在上面添加其它控件,可拖动

请问一下应该怎么做,或是有什么第三方控件可以直接指定透明格式图片做为窗口形状的,谢谢
展开
 我来答
皆金32
推荐于2016-02-16 · TA获得超过1.5万个赞
知道大有可为答主
回答量:3366
采纳率:84%
帮助的人:280万
展开全部
  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;
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
inboy012
2011-03-17
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
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;
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户82039
2011-03-17 · TA获得超过197个赞
知道答主
回答量:152
采纳率:0%
帮助的人:0
展开全部
D2007以前的,所谓的支持是假象,你可以设计在运行时直接加载png到Btn试试看.
至於设计时的支持,那是因为有PropertyEditor的处理,我估计属性编辑对png的图片做了转换,就这样而已
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式