【问题标题】:How to make a groupbox's background transparent?如何使组框的背景透明?
【发布时间】:2013-10-23 08:24:21
【问题描述】:

如何将 Groupbox 设置为透明?我找到了这个 Transparent, 但就我而言,我放了 TImage 并放了一个背景图像,然后是 Groupbox,我不知道如何使 groupbox 透明,并将图像显示为背景。

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

【问题讨论】:

  • 那么你想要一个透明的组合框(即,没有背景的组合框(如果吹毛求疵 - 现在有可见的标题并且也没有边界线))还是想要一个带背景 PCITURE 的组合框(可见图片 - 这意味着不透明)?
  • 第一个,没有背景的透明分组框,有可见的标题和边界,先生,这可能吗?
  • JediVCL (jvcl.sf.net) 带有 JvGGroupBox.pas,其 TJvgGroupBox 类具有透明属性 - 您可以尝试查看它是如何实现的。在某种程度上你可能还需要docwiki.embarcadero.com/Libraries/XE3/en/…
  • DeveloperExpress 组件也具有透明属性,在您的情况下为 TCxRadioGroupBox

标签: delphi delphi-7 vcl


【解决方案1】:

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

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;

输出如下所示:

您可能想要自定义绘画的其余部分。也许在组框内绘制背景就足够了,这样标题和框架就可以正常显示了。如果需要,请在对 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;

如果您要正确执行此操作,您会想要制作一个合适的组件,而不是使用中介层。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2011-09-17
  • 2011-02-18
  • 2016-10-24
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多