如何使groupbox的背景透明化?

时间:2013-10-23 08:24:22

标签: delphi delphi-7 vcl

如何将Groupbox设置为透明?我找到了这个 Transparent, 但在我的情况下,我把TImage放了一个背景图片,然后是Groupbox,我不知道如何让groupbox透明,并将图像显示为背景。

我尝试在google上搜索,但找不到答案,并尽可能地使用VCL应用程序。

1 个答案:

答案 0 :(得分:4)

我认为你需要接管绘制组合框。这是一个使用插入器类的简单示例。在声明表单之前,将此类放在与表单相同的单元中:

type
  TGroupBox = class(StdCtrls.TGroupBox)
  protected
    procedure Paint; override;
  end;

  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    ....
  end;

....

procedure TGroupBox.Paint;
begin
  Canvas.Draw(0, 0, SomeGraphicObjectContainingYourBackground);
  inherited;
end;

输出如下:

enter image description here

您可能想要自定义绘画的其余部分。也许它足以在组框内绘制背景,以便标题和框架显示为正常。如果需要,请在Canvas.Draw的调用中指定不同的坐标。如果您需要背景来覆盖整个父画布,那么您对Draw的调用需要传递-Left-Top作为坐标。

或许您想要接管框架的绘图。通过不调用继承的Paint方法并完成自己的工作来做到这一点。

为避免闪烁,您最好将此绘画代码移至WM_ERASEBKGND。这使得事情变得更复杂,但并不多。代码如下所示:

type
  TGroupBox = class(StdCtrls.TGroupBox)
  protected
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
  end;

procedure TGroupBox.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  Canvas.Handle := Message.DC;
  try
    Canvas.Draw(-Left, -Top, SomeGraphicObjectContainingYourBackground);
  finally
    Canvas.Handle := 0;
  end;
  Message.Result := 1;
end;

如果你打算做得恰到好处,你需要制作一个合适的组件,而不是用插页器进行黑客攻击。