结合航空玻璃效果和SWT

时间:2010-09-02 13:43:38

标签: java windows swt aero aero-glass

作为一个宠物项目,我一直在玩将Aero Glass效果集成到我的SWT应用程序中的概念。 Łukasz Milewski has an excellent blog post解释了如何实现这一点,这几乎归结为:

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),但是以合理的方式使用它?

3 个答案:

答案 0 :(得分:2)

重写的方法是“包私有”。为了在没有编译时错误的情况下覆盖它们,您必须将类放在与超类相同的包中,即org.eclipse.swtorg.eclipse.swt.widgets包。你引用帖子的博客实际上在最后提到了这个实现细节,所以我不知道,这真的回答了你的问题。

答案 1 :(得分:0)

将控件置于玻璃区域之外或尝试使用强制背景颜色作为控件。

答案 2 :(得分:0)

您关注的是覆盖内部方法的解决方案,但您首先使用的是内部SWT类。这似乎是一种非常愚蠢的脆弱方式(至少在当前的SWT实现中)为你的应用程序添加了一些眼睛......我希望你不要在生产代码中这样做。