【问题标题】:Combining Aero Glass effects and SWT结合 Aero Glass 效果和 SWT
【发布时间】:2011-04-07 08:39:51
【问题描述】:

作为一个宠物项目,我一直在尝试将 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();
    }
}

这很好用,直到您想添加一个控件。这会导致黑色保持透明:

A follow-up post 也演示了如何执行此操作,但需要修改 SWT 库。 (至少,我相信是这样,因为私有 SWT 函数被 @Override 覆盖。)

如何避免控件变得透明?更好的是:我怎样才能从透明度中受益(例如在上面放置图像like so),但要以合理的方式使用它?

【问题讨论】:

    标签: java windows swt aero aero-glass


    【解决方案1】:

    将您的控件放在玻璃区域之外或尝试为控件使用强制背景颜色。

    【讨论】:

    • 将我的控件放在玻璃区域之外或多或少会破坏效果的目的。我也不认为“避免黑色”是一个现实的选择。我知道有一种方法可以正确地做到这一点(一位同事提到在 C# 中解决了类似的问题),所以我会继续努力。
    【解决方案2】:

    您担心覆盖内部方法的解决方案,但您首先使用的是内部 SWT 类。这似乎是一种非常骇人听闻的脆弱方式(至少在当前的 SWT 实现中)为您的应用添加一些吸引眼球的方式......我希望您不要在生产代码中这样做。

    【讨论】:

    • try { ... } catch (Throwable e) {} 包裹它肯定不会有什么坏处。这只是养眼,所以如果失败了,没什么大不了的,对吧?当前生产代码中有一些OS 引用,就是这样实现的。这真的是非常糟糕的做法吗?
    • 重写私有方法也不是我的关注;更重要的是我无法在没有编译错误的情况下完成它。我做错了什么?
    【解决方案3】:

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

    【讨论】:

    • 我只是读过了。果然,这使得所有东西都可以毫无问题地编译,但是还有很多东西仍然无法正常工作。一个完整的例子会很棒,因为只有通过在callWindowProc() 中设置一些常量和一些额外的情况,我才能让OpaqueText 确实显示不透明的文本。我会在早上用我当前的代码更新我的问题。
    • 赏金到期了,我奖励给你。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2010-12-30
    • 2010-10-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多