2010-09-02 31 views
6

作爲一個寵物項目,我一直在玩將Aero Glass效果集成到我的SWT應用程序中的概念。 Łukasz Milewski has an excellent blog post解釋這是如何實現的,這幾乎歸結爲:結合Aero Glass效果和SWT

final Display display = new Display(); 
final Shell shell = new Shell(display); 
shell.setLayout(new FormLayout()); 
final MARGINS margins = new MARGINS(); 
margins.cyTopHeight = -1; 

final Composite c = new Composite(shell, SWT.NORMAL); 
c.setBackground(new Color(shell.getDisplay(), new RGB(0, 0, 0))); 
final FormData fd = new FormData(); 
fd.top = new FormAttachment(0, 0); 
fd.left = new FormAttachment(0, 0); 
fd.right = new FormAttachment(100, 0); 
fd.bottom = new FormAttachment(100, 0); 
c.setLayoutData(fd); 

OS.DwmExtendFrameIntoClientArea(shell.handle, margins); 

shell.open(); 
while (!shell.isDisposed()) { 
    if (!display.readAndDispatch()) { 
     display.sleep(); 
    } 
} 

這工作很漂亮,直到您要添加控件。這導致黑其餘透明:

Transparent shell with control

A follow-up post演示瞭如何做到這一點,太,但需要修改的SWT庫。 (至少,我相信如此,因爲私人SWT功能被@Override覆蓋。)

如何避免控件變爲透明?更好:我如何從透明度中受益(例如將圖像放置在其上like so),但是以合理的方式使用它?

+1

你可以添加生活鏈接嗎? – Supuhstar 2012-10-05 04:21:58

回答

2

重寫的方法是「package private」。爲了在沒有編譯時錯誤的情況下覆蓋它們,你必須將你的類放入與超類相同的包中,即org.eclipse.swtorg.eclipse.swt.widgets包。你引用的博客最後實際上提到了這個實現細節,所以我不知道,這真的會回答你的問題。

+0

我簡單閱讀過去。毫無疑問,這可以讓所有的東西在沒有任何問題的情況下編譯,但是還有很多東西仍然無法正常工作。一個充分發揮作用的例子會很好,因爲只有在'callWindowProc()'中設置一些常量和一些額外的例子,我才能得到'OpaqueText'確實顯示不透明的文本。我會在早上用我當前的代碼更新我的問題。 – 2010-09-12 21:11:24

+0

既然賞金到期了,我會獎給你。 – 2010-09-13 21:30:50

0

將您的控件放在玻璃區域之外或嘗試爲控件使用強制背景顏色。

+0

將我的控件放置在玻璃區域外或多或少會影響效果的目的。我不認爲「避免黑色」也是一種現實的選擇。我知道有一種正確的方法(一位同事提到在C#中解決類似的問題),所以我會繼續研究它。 – 2010-09-09 15:49:14

0

您對覆蓋內部方法的解決方案感到擔憂,但您首先使用的是內部SWT類。這看起來像是一種很脆弱的方式(至少在目前的SWT實現中)爲你的應用程序添加了一些視覺效果......我希望你在生產代碼中沒有這樣做。

+0

將它包裝在try {...} catch(Throwable e){}'當然不會受到傷害。這只是眼睛的糖果,所以如果失敗了,沒有什麼大不了的,對吧?在當前生產代碼中有一些'OS'引用,就像那樣執行。練習真的很不好嗎? – 2010-09-10 08:59:01

+0

這也不是我的一個擔心,因爲它是壓倒一切的私人方法;更多的是我無法在沒有編譯錯誤的情況下完成任務。我究竟做錯了什麼? – 2010-09-10 09:00:11