6

作为一个宠物项目,我一直在尝试将 Aero Glass 效果集成到我的 SWT 应用程序中。Łukasz Milewski 有一篇很棒的博客文章解释了如何实现这一点,这几乎可以归结为:

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();
    }
}

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

带控制的透明外壳

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

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

4

3 回答 3

2

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

于 2010-09-10T17:55:08.710 回答
0

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

于 2010-09-09T11:57:02.390 回答
0

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

于 2010-09-09T17:44:02.677 回答