【发布时间】:2011-07-02 07:32:57
【问题描述】:
我想让 SWT Canvas 的背景透明,以便可以看到它后面的其他小部件。
我尝试将 alpha 设置为 0 并用矩形填充画布,并且还使用选项 SWT.NO_BACKGROUND 无济于事。
【问题讨论】:
我想让 SWT Canvas 的背景透明,以便可以看到它后面的其他小部件。
我尝试将 alpha 设置为 0 并用矩形填充画布,并且还使用选项 SWT.NO_BACKGROUND 无济于事。
【问题讨论】:
AFAIK,SWT 不可能以这种方式(以跨平台方式)将小部件放置在彼此之上。透明背景不允许看到其他小部件。此外,对透明像素的任何点击都不会委托给后面的小部件。
但是您可以将贝壳彼此叠放。您可以创建透明壳或具有不规则边界的壳。请参阅Snippets 中的 Shell 示例。这不一样,但根据您想要实现的目标,它可能就足够了。
【讨论】:
有一种方法可以在 Linux (GTK) 上实现。 (但是,它不在 Windows 上工作。(不了解 MacOSX。))
只需 setBackground 到带有 alpha 通道的 RGBA。例如:
Canvas canvas = new Canvas(parent, SWT.NONE);
canvas.setBackground(new Color(canvas.getDisplay(), 100,100,100,100));
//Note the last argument (I'm setting not only R, G, B, but also A).
您甚至不需要SWT.NO_BACKGROUND、SWT.TRANSPARENT 或其他样式标志。
P.S.:您不应该以这种方式创建颜色。颜色将使用 dispose 进行处理。将新创建的颜色分配给变量,以便能够重用它并释放它。为了简单起见,我创建了“内联”颜色。
附加说明:不要将 alpha-channel 设置为 0。虽然较小的值应该意味着更透明,但实际上它不适用于值 0,仅适用于 1 及以上。可能,它认为 0 为未设置或等等。
【讨论】:
在 Windows 上,我成功实现了以下透明控制:
final Composite composite = new Composite(parent, SWT.TRANSPARENT);
composite.addListener(SWT.Paint, new Listener() {
@Override
public void handleEvent(Event event) {
event.gc.drawString("hello world", 0, 0, true);
}
});
很遗憾,这不适用于 OS X 或 Linux。
【讨论】:
你可以使用:
shell.setAlpha(180);
该值的设置范围为 0 到 255。 0 表示透明,255 表示纯色背景
【讨论】:
试试:
new Canvas(parent, SWT.TRANSPARENT);
【讨论】: