2010-03-17 59 views
2

我正在使用delphi 2010有没有办法让TRadioButton变得透明?

+0

从什么意义上说它不透明?我刚创建了一个带有背景图片的Delphi窗体,并添加了一些TRadioButton。它们都很好地融入背景。 – 2010-05-15 20:39:57

+0

只是当主题启用 – 2010-05-19 13:46:17

回答

3

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

我,有一次,曾试图使复选框透明运行时主题项目选项未启用,还是经典的题材选择与OS的;结果并不完美。以下是应用于RadioButton的相同代码。

问题容易noticable是,因为你会从代码猜测,这是一个有点flickery,它是不是透明的,当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; 
+0

对我来说工作得非常好!感谢塞尔特克! – 2010-05-18 12:35:14

1

一个简单的技巧:使按钮颜色变白,缩小到最小尺寸,只有按钮;并在其后放置一个透明标签。

否则,做一个真正的按钮,透明的,你需要所有者绘制它。你可以在网上找到一些例子。

我发现了一些关于响应WM_CTLCOLOR消息的信息。但我尽快尝试,但无法完成它的工作。

+0

嗯......你知道一个单选按钮是圆的,而不是正方形吗?所以即使我们忽略了标签,单选按钮仍然是一个问题。 – 2010-05-15 20:33:54

0

最简单的方法是购买设置像Raize Components一个组件,它会为你和其它更多的除了做到这一点。特别是Raize允许您自定义UI的很多方面。

+0

我希望使用Delphi自带的相同单选按钮 – 2010-03-17 13:15:29

+0

是的,当然这只是Win32按钮的一个包装。 – 2010-05-15 20:37:04

+0

@Andreas - 不,它不是。如果你看到透明度的来源和复杂性,你会知道它不是纯粹的包装。 – mj2008 2010-05-16 09:05:21

2

报价雷米勒博(TeamB):

的TLabel是TGraphicControl 后裔,因此必须手动完成所有的 自己的图纸,以便根据需要可以 实施的透明度。 TCheckBox和TRadioButton,在 另一方面,是TWinControl 后代该包装标准的Win32 API 控制,并因此受到 任何能力OS支持 为他们(透明度不是其中 之一)。 https://forums.codegear.com/thread.jspa?threadID=24027&tstart=375

您可能需要做一些繁重的压倒一切,否则你将需要使用第三方组件...

1

我与2009年德尔福标准的VCL TRadioButton控制实验(我想德尔福2010年是一样的)。

如果编译启用运行时主题项目(项目 - >选项 - >应用程序 - >启用运行时主题),该TRadioButton控制是透明的,它的“颜色”属性被忽略。如果禁用运行时主题,则TRadioButton控件不透明,其背景由其“Color”属性定义。

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

相关问题