2010-03-17 55 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單選按鈕封裝)

相關問題