有没有办法让TRadioButton变得透明?

时间:2010-03-17 11:29:41

标签: delphi radio-button transparency delphi-2010 transparent

我正在使用delphi 2010

6 个答案:

答案 0 :(得分:3)

我同意Andreas和Serg的观点,即在启用主题时控件是透明的。

我曾经试图使CheckBox透明,因为在项目选项中没有启用运行时主题,或者在操作系统中选择了经典主题;结果并不完美。以下是应用于RadioButton的相同代码。

容易引起注意的问题是,正如您从代码中猜到的那样,它有点闪烁,而且当DoubleBuffered时它不透明。一个不易察觉的问题可以(有时)通过在包含控件的表单前面放置一个不同的窗口,然后慢慢将它移到一边来复制,有时会留下一些文物。

嗯,无论如何,这里是;

type
  TMyRadioButton = class(TRadioButton)
  private
    procedure CnCtlColorStatic(var Msg: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
    procedure WmEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WmPaint(var Msg: TWMNCPaint); message WM_PAINT;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

uses
  themes;

procedure TMyRadioButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TMyRadioButton.WmPaint(var Msg: TWMNCPaint);
begin
  if not (ThemeServices.ThemesEnabled or DoubleBuffered) then
    InvalidateRect(Handle, nil, True);
  inherited;
end;

procedure TMyRadioButton.WmEraseBkgnd(var Msg: TWMEraseBkgnd);
var
  R: TRect;
begin
  if not (ThemeServices.ThemesEnabled or DoubleBuffered)
       and (Parent <> nil) then begin
    R := Rect(Left, Top, Left + Width, Height + Top);
    InvalidateRect(Parent.Handle, @R, True);
    UpdateWindow(Parent.Handle);
    Msg.Result := 1;
  end else
    inherited;
end;

procedure TMyRadioButton.CnCtlColorStatic(var Msg: TWMCtlColorStatic);
begin
  if not (ThemeServices.ThemesEnabled or DoubleBuffered) then begin
    SetBKMode(Msg.ChildDC, TRANSPARENT);
    Msg.Result := GetStockObject(NULL_BRUSH);
  end else
    inherited;
end;

答案 1 :(得分:2)

引用Remy Lebeau(TeamB):

  

TLabel是一个TGraphicControl   后代,因此必须做所有的   手动绘制它自己的绘图,所以它可以   根据需要实施透明度。   TCheckBox和TRadioButton,关于   另一方面,是TWinControl   包装标准Win32的后代   API控件,因此受制于   操作系统支持的任何功能   对他们而言(透明度不是其中之一)   他们)。   https://forums.codegear.com/thread.jspa?threadID=24027&tstart=375

您需要做一些重要的覆盖,否则您将需要使用第三方组件......

答案 2 :(得分:1)

一个简单的诀窍:将按钮颜色设为白色,将其缩小到最小尺寸,仅按钮;并在其后面放一个透明标签。

否则,要使按钮真正透明,您需要拥有者绘制它。您可以在网上找到一些示例。

我找到了一些有关响应WM_CTLCOLOR消息的信息。但是我试了一下,但是不能让它起作用。

答案 3 :(得分:1)

我在Delphi 2009中尝试了标准的VCL TRadioButton控件(我认为Delphi 2010是相同的)。

如果您在启用运行时主题的情况下编译项目(Project-&gt; Options-&gt; Application-&gt; Enable Runtime Themes),则TRadioButton控件是透明的,并忽略其“Color”属性。如果禁用运行时主题,则TRadioButton控件不透明,其背景由其“Color”属性定义。

所以我假设标准VCL TRadioButton(和底层的Windows控件)是由Windows主题透明的,而不是由控件本身透明。您可以在应用程序级别关闭主题支持,在这种情况下,您将获得一个非透明的单选按钮。如果您需要禁用运行时主题的透明单选按钮,请使用第三方自定义单选按钮(TCustomControl后代,而不是标准的Windows单选按钮包装)

答案 4 :(得分:0)

最简单的方法是购买一个像Raize Components这样的组件集,它可以为你做更多的事情。特别是Raize允许您自定义UI的许多方面。

答案 5 :(得分:0)

http://www.torry.net/quicksearchd.php?String=transparent+radiobutton&Title=No可能有所帮助。这些都不是D2010或D2009,但我相信移植是可能的。