在Delphi中有没有一种方法可以在图片周围塑造一个按钮

在Delphi中有没有一种方法可以在图片周围塑造一个按钮,delphi,button,shapes,Delphi,Button,Shapes,我正在使用TMS软件中一个名为TAdvShapeButton的组件来创建一个圆圈周围的按钮 此按钮通过为添加图片来工作;停机、热态、禁用和正常状态。 它保留PNG的透明度,除非一个TAdvShapeButton位于另一个TAdvShapeButton之上 这对以下问题有影响,因为按钮是矩形的 有没有办法将此按钮的形状从矩形更改为与其加载的图片相匹配 我猜的是,什么是用来取整表单的角的: procedure TfCompass.FormCreate(Sender: TObject); var

我正在使用TMS软件中一个名为TAdvShapeButton的组件来创建一个圆圈周围的按钮

此按钮通过为添加图片来工作;停机、热态、禁用和正常状态。 它保留PNG的透明度,除非一个TAdvShapeButton位于另一个TAdvShapeButton之上

这对以下问题有影响,因为按钮是矩形的

有没有办法将此按钮的形状从矩形更改为与其加载的图片相匹配

我猜的是,什么是用来取整表单的角的:

procedure TfCompass.FormCreate(Sender: TObject);
var
  region:HRGN;
begin
  region := CreateRoundRectRgn(ClientRect.left, ClientRect.top, ClientRect.right, ClientRect.bottom, 326, 326);
  SetWindowRgn(Handle, region, true);
end;
我不知道怎么继续

多谢各位

编辑1:

即使将TAdvShapeButtons拖放到表单上,也会出现此问题


根据Sertac的建议,我发现了以下代码:


虽然我想通过在我的ShapeButton中使用png来创建HRGN,但我发现圆角可以防止重叠。

根据Sertac的建议,我发现了以下代码:


虽然我想找到一种在我的ShapeButton中使用png创建HRGN的方法,但我发现圆角可以防止重叠。

最常用的保持透明度的方法是将父画布绘制为背景,然后在其上绘制自己的内容(png,文本…),因此,我首先要看的是按钮是否是
TGraphicControl
的后代。如果是,第一个也是最快的修复方法是将它变成
TCustomControl
的后代,这样所有按钮即使重叠也不再共享相同的绘图空间。现在,当用户稍微倾斜我的头来阅读文本时,会很烦人。如果我处于您的位置,我会将按钮的形状改为圆形,并使用不同颜色的按钮水平书写文本(即使只是交替使用相同背景色的阴影),作为奖励,可能会使所有这些都成为单个控件。TAdvCustomShapeButton=class(TCustomControl、IWinStyle、itmsstylex)我想把它们做成圆圈,但结果是它们太大,文本太小..上面图像中的蓝色圆圈也是
TadvCustomsShapeButton
?最常用的保持透明度的方法是将父画布绘制为背景,然后在其上绘制自己的内容(png,文本…),因此,我首先要看的是按钮是否是
TGraphicControl
的后代。如果是,第一个也是最快的修复方法是将它变成
TCustomControl
的后代,这样所有按钮即使重叠也不再共享相同的绘图空间。现在,当用户稍微倾斜我的头来阅读文本时,会很烦人。如果我处于您的位置,我会将按钮的形状改为圆形,并使用不同颜色的按钮水平书写文本(即使只是交替使用相同背景色的阴影),作为奖励,可能会使所有这些都成为单个控件。TAdvCustomShapeButton=class(TCustomControl、IWinStyle、itmsstylex)我想把它们做成圆圈,但结果它们太大了,文本太小了..上面图像中的蓝色圆圈也是
TadvCustomsShapeButton
?“EM…”是编辑消息,我怀疑代码中的中间3行没有效果。“EM…”是编辑消息,我怀疑代码中的中间3行没有效果。
procedure TForm1.MakeRounded(Control: TWinControl; iCorner : Integer);
var
  R: TRect;
  Rgn: HRGN;
begin
  with Control do
  begin
    R := ClientRect;
    rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, iCorner, iCorner);
    Perform(EM_GETRECT, 0, lParam(@r));
    InflateRect(r, - 5, - 5);
    Perform(EM_SETRECTNP, 0, lParam(@r));
    SetWindowRgn(Handle, rgn, True);
    Invalidate;
  end;
end;