2010-09-02 57 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