2009-04-17 74 views
3

由於某些原因,窗體上的透明控件在某些計算機上變得不透明。我收到了關於它發生在「Acer Netbook」和「Thinkpad x600」上的報道。該應用程序是用Delphi 2007德爾福:透明控件在上網本上變得不透明

這是什麼樣子: link

雖然它看起來應該是這樣: link

表格上的不透明控件TLabels和TStaticTexts。我使用TStaticText控件來定義可點擊區域,因爲鼠標消息到無處理控件(如標籤)轉到WM_NCHITTEST處理程序。底部的「按鈕」是黑色的,因爲我不小心將其顏色設置爲clNone,儘管它應該是根本不可見的。)

爲什麼會發生這種情況,以及如何防止這種情況(除了將文本呈現到背景圖像之類的解決方法之外)?

編輯:我設法在我的筆記本電腦上運行Windows XP的32位顏色,並使用經過認證的ATI驅動程序重現問題。

+1

我有一個類似的問題,在IDE中,標籤是透明的,但在運行時是不透明的。在我的情況下,我不得不將標籤透明度屬性設置爲false,保存項目,然後將透明返回true。之後,他們透明的設計時間和運行時間。我正在使用Delphi XE3。 – drzymala 2013-05-13 21:41:40

回答

8

TLabel和表單之間是否存在TImage?如果是這種情況,請將窗體的顏色設置爲黑色。當您將TLabel設置爲透明時,會將其繪製在其父級上,並且TImage不能具有子級控件。實際上,它將表單的顏色渲染到標籤上,因爲表單是父項。其他

兩個可能的解決方法包括直接paining圖像到形式(不使用的TLabel),但我不知道這是否會工作。另一個將創建自己的圖像控件,從TWinControl(而不是TGraphicControl),並可以包含子控件下降。 YMMV對這些解決方案雖然。

我懷疑它不會在一些機器上工作的原因是底層的Windows API庫是不同的。

3

這與系統的品牌本身無關。在可能的順序,檢查這些(假設你在談論Windows系統):

  • 透明度要求顯示器位深度是32。如果顯示器設置爲16位色,你可以」繪製透明控件。用戶可修復,你不應該自動開關模式。

  • 視頻驅動程序問題 - 確保用戶擁有製造商推薦的視頻驅動程序。如果這些失敗,請嘗試最新的。

  • 透明度(alpha混合,實際上)僅支持Windows 2000或更高 - 你確定他們沒有運行的是舊的?

這將有很大的幫助,如果你從你的用戶得到更多的數據(或者,如果你有這些數據,請張貼。)我們正在拍攝盲人在這裏,因爲你甚至沒有提到使用的操作系統。

+3

TLabel實際上是在其父文件上繪製的,並且不會被窗口渲染爲透明文件,所以我不相信這是一個驅動程序問題。我很確定TLabel自從至少Delphi 3之前已經具有了透明屬性,這是在Windows 2000之前的)。 – 2009-04-17 18:36:07

+0

的確如此,沒有想到,Delphi不會將alpha用於標籤(在這種情況下,它很可能是驅動程序問題)。我們仍然沒有足夠的信息 - 它可能是16位或調色板視頻模式問題加上沒有足夠的可用顏色。 – 2009-04-17 19:05:35

+2

我設法在我的筆記本電腦上重現了這個問題,該筆記本電腦以32位顏色運行Windows XP。它也使用經過認證的ATI驅動程序,因此我認爲您指定的任何內容都不適用... – 2009-04-18 12:43:45

0

,而不是一個完美的解決方案,但將努力在處理您的透明度問題,更好的方式是不使用透明度可言,設置標籤的背景顏色相匹配的背景是,然後使用對齊與利潤率屬性和設置您的邊距將標籤放置在表單上。對於下一步,關閉和最小化按鈕,我會使這些獨立的圖形,以避免任何字體或DPI問題。

0

我遇到了這個問題,這讓我發瘋。

我的應用程序使用TLabels而不是TButton。在運行時我創建了TShapes,大小適合標籤。我設置OnMouseEnter和OnMouseLeave事件來更改TShape的顏色。它在我測試過的每臺機器上工作都很好,直到我遇到了這個特殊的XP安裝,我遇到了OP的問題。

我終於找到了一個有效的解決方案。

for i := 0 to frm.ComponentCount-1 do begin 
    if (frm.Components[i] is TLabel) and 
    (((TLabel(frm.Components[i]).Tag > 999) and 
    (Length(TLabel(frm.Components[i]).Caption) > 1) and (Assigned(TLabel(frm.Components[i]).OnClick))) or 
    (TLabel(frm.Components[i]).Caption = 'Close')) then 
    begin 
     //setting this to false here, then to true at the bottom eliminates the "opaquing" problem 
     TLabel(frm.Components[i]).Transparent := False; 

     ls := TShape.Create(frm); 
     ls.Name := 'ClickLabel' + IntToStr(i) + TWinControl(frm.Components[i]).Name; 
     ls.Parent := TWinControl(frm.Components[i]).Parent; 
     ls.Hint := TWinControl(frm.Components[i]).Hint; 
     ls.ShowHint := True; 
     ls.Top := TWinControl(frm.Components[i]).Top-4; 
     ls.Left := TWinControl(frm.Components[i]).Left-7; 
     ls.Width := TWinControl(frm.Components[i]).Width + 12; 
     ls.Height := TWinControl(frm.Components[i]).Height + 8; 
     ls.Shape := stRoundRect; 
     ls.BringToFront; 
     TWinControl(frm.Components[i]).BringToFront; 
     ls.Visible := TWinControl(frm.Components[i]).Visible; 
     ls.Tag := TWinControl(frm.Components[i]).Tag; 

     ls.OnMouseEnter := EvHandler.lblNavMouseEnter; 
     ls.OnMouseLeave := EvHandler.lblNavMouseLeave; 
     ls.Anchors := TLabel(frm.Components[i]).Anchors; 

     ls.Pen.Width := 2; 

     TLabel(frm.Components[i]).Transparent := True; 
    end; 
end; 
1

如果TFormTImageTLabel就可以了 - 不存在具有透明度的問題,有的時候標籤是不是透明的,即使TLabel.Transparent屬性顯示爲True

我已經使用VMWare和Windows XP/Windows 7轉載了這個問題。爲了實現它,我必須啓用「Windows Classic」主題。 Windows 7具有Windows Aero主題,Windows Basic和Windows Classic主題。僅當啓用「Windows Classic」主題時纔會出現問題。 (Windows XP也有這個主題)。

TLabel已經有Transparent屬性,它是True是默認值。除了啓用「Windows Classic」主題時,標籤是透明的。 當您在窗體上放置新標籤時 - 它的Transparent屬性顯示爲True,但在對象檢查器中未顯示加粗。 要解決透明度問題,您只需切換標籤的Transparent屬性:首先將其設置爲False,然後返回True。這將使標籤的Transparent屬性顯示爲True,但值將爲加粗。或者只需編輯.dfm文件並將Transparent = True添加到需要透明度的所有標籤。

這個問題是德爾福10.2東京的實際情況。