似乎唯一的解決方法是所有者繪製或第三方按鈕控件Check out the Glass Button by Roy Klever或者如下面鏈接的質量控制條目中所述TBitBtn帶有DoubleBuffered = false,這是此問題上面已接受的答案。
這是Windows Aero DWM中的一個錯誤,或者是Windows常見控件中的錯誤,或者是VCL類層次處理常見控件窗口消息和繪製玻璃時繪畫的錯誤。總之,Windows常用控件不能在玻璃上正確地自行塗漆,或者DWM組合(Aero)破損。驚喜。
標準的VCL按鈕組件使用Windows Common Controls中的Window Class BUTTON。
請注意TSpeedButton不使用Windows公共控件,並沒有這個問題。但是,它也不接受重點。
看來Embarcadero知道這個問題,它是QC# 75246,它是關閉的,因爲它實際上是公共控制庫中的一個錯誤,就像Will not Fix一樣,建議使用TBitBtn。按鈕並不孤單,這是一組QC報告的一部分,包括面板和其他常用控件。
但是,我有一個商業TcxButton(開發人員快速組件的一部分)接受鍵盤焦點,並沒有畫出這個故障。任何使用Win32公共控件按鈕控件的代碼似乎都有此問題。低級別的Win32 API黑客可能會找到解決方法。我正在研究它。如果我知道這個答案將會被更新。
一個有趣的細節:TcxButton有三種繪畫風格,cxButton.LookAndFeel.Kind = {lfOffice11,lfFlat,lfStandard}。選擇lfOffice11會將此故障重新加入。它看起來像是Vista/Win7中的aero中的玻璃功能與普通的control/xptheme按鈕繪圖代碼之間的奇怪交互。
這可能是唯一的解決方法是使用完全應用繪製的按鈕控件,並且不使用Windows常用控件按鈕或任何依賴於XP主題引擎的按鈕控件在航空玻璃窗格上繪製按鈕。
編輯:7月28日,Embarcadero的某人已經關閉了上述質檢條目,這是一個錯誤。我敦促他們重新打開它,如果只是爲了澄清這是否確實是常見控件DLL中的Windows錯誤。
如果你想玩弄,從StdCtrls複製TButton和TCustomButton類的VCL源代碼,就像我在這裏所做的那樣,修改CNCtlColorBtn,以便強制執行三件事之一 - PerformEraseBackground, DrawParentBackground或繼承,並查看結果。有趣的東西。
procedure TCustomGlassButton.CNCtlColorBtn(var Message: TWMCtlColorBtn);
begin
PerformEraseBackground(Self, Message.ChildDC);
Message.Result := GetStockObject(NULL_BRUSH);
(*
with ThemeServices do
if ThemesEnabled then
begin
if (Parent <> nil) and Parent.DoubleBuffered then
PerformEraseBackground(Self, Message.ChildDC)
else
DrawParentBackground(Handle, Message.ChildDC, nil, False);
{ Return an empty brush to prevent Windows from overpainting we just have created. }
Message.Result := GetStockObject(NULL_BRUSH);
end
else
inherited;
*)
end;
Some interesting reading on Vista era glass/DWM/aero APIs (C++ developers blog)
您是否擁有顯示此行爲的最小應用程序的來源? (.dfm和.pas的簡單形式將會這樣做) – 2010-07-26 14:26:48
@Jeroen:我可以用包含TButton並設置玻璃框的簡單表單重現該行爲,以便按鈕位於玻璃上。我目前無法連接到QC,因此我無法確定是否存在類似的錯誤。 – 2010-07-26 14:30:50
有趣的行爲 - 當button.doublebuffered爲true,但形式doublebuffered是假的,我得到一個顏色(黑色)周圍的按鈕,當兩個是真實的,我得到不同的顏色(如上面,灰色或clBtnFace),當按鈕不是雙緩衝的,文本看起來變灰。所以如果沒有看起來像垃圾,在delphi 2010上使用玻璃上的按鈕是不可能的? – 2010-07-27 20:13:12