我正在使用delphi 2010
答案 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,但我相信移植是可能的。