Topic: SWT控件背景透明问题

  Print this page

1.SWT控件背景透明问题 Copy to clipboard
Posted by: Sunteya
Posted on: 2005-03-30 15:23

在swing中可以通过setOpaque(true) 来使控件透明?
而在SWT中怎么设置才可以使Composite透明呢?
哪位大哥知道呀。指点一下,谢谢哈

2.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: Sunteya
Posted on: 2005-03-30 15:58

简单的说就像 在XP下的任务管理器的TAB 灰色 和 我的电脑->属性的TAB的白色区别。

我试过SWT.NO_BACKGROUND好象不行 。

3.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: marsbible
Posted on: 2005-03-30 16:00

奇怪,透明了不就看不见了吗,用setVisible()不久ok
反正不需要透明度

4.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: Sunteya
Posted on: 2005-03-30 17:06

其实也不能算是透明不透明的问题了。
如果设置成setVisible的话 他上面的控件也都没有了吧。
因为在XP下 TAB是白色的背景的。而如果没有透明的话 就看不到这个白色的背景了,而只能看到灰色

5.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: marsbible
Posted on: 2005-03-30 17:23

还真是,这个问题很有价值啊

6.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: skyandmusic
Posted on: 2005-04-03 11:27

我不知道你是不是这个意思。。你自己copy下去试试

OS.SetWindowLong(shell.handle , OS.GWL_EXSTYLE , OS.GetWindowLong(shell.handle , OS.GWL_EXSTYLE)^0x80000);

7.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: Sunteya
Posted on: 2005-04-03 15:52

楼上的大哥不明白我的意思啊,那我就在说一下吧。
这个问题是我在Windows XP下用SWT做Tab时遇到的。

做Tab的时候,如果需要在选项卡(TabItem)上添加多个控件的话,是应该需要先把
这些控件添加到一个Composite中,然后在用TabItem的setControl(Control control) 才
行吧,因为setControl(Control control) 之支持一个控件而且也不支持Layout。

而我们知道在Windows下Composite默认的应该是灰色的背景,而把带有灰色背景的Composite添加到TabItem的中的话,当程序运行的时候由于Windows的经典式样,
出现的Tab本身就是灰色的背景,所以界面看上去很好。

但Windows XP有提供了一个XP 风格的式样,在这个式样下TAB的背景变成了白色的渐变。而原来Composite由于是使用灰色的背景的所以这就和TAB显的格格不入。
同样的问题如果用swing的话只需要对JPanel使用setOpaque(false)就可以使TAB显示
出他原来的白色渐变背景,而这在SWT下我却怎么也做不到。(也就是3楼的那个图)

同样的问题也存在在比如,对于一个想用图案做背景的控件上,放上一个Composite,
想在上面放写控件,想让这些控件显示出来。但实际上的效果却是在图案的背景上
有一个灰色的矩形区域,在这个矩形的区域上才有控件,但原本的意图是要看不到这些
灰色的Composite背景而直接看到 原本的图案背景。

原本我以为蛮简单的只要用SWT.NO_BACKGROUND就可以了,但实际上NO_BACKGROUND把
所有的背景都去掉了。或者说直接就可以看到其他程序了(就像是镂空的效果)。

我本人也是这几天刚刚开始用SWT 做东西,所以还是希望各位有经验的大哥帮忙解决下这个问题,谢谢了

8.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: Sunteya
Posted on: 2005-04-03 15:56

发完帖才想起来skyandmusic 兄弟所说的
OS.SetWindowLong(shell.handle , OS.GWL_EXSTYLE , OS.GetWindowLong(shell.handle , OS.GWL_EXSTYLE)^0x80000);
好象可以用他来产生一个什么都看不到的窗口,但好象不可以使Composite透明,不知我说的对不对

9.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: yipsilon
Posted on: 2005-04-03 15:58

试试这个:


import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class RingShell {
int[] createCircle(int radius, int centerX, int centerY) {
int[] points = new int[360 * 2];
for (int i = 0; i < 360; i++) {
points[i * 2] = centerX + (int) (radius * Math.cos(Math.toRadians(i)));
points[i * 2 + 1] = centerY + (int) (radius * Math.sin(Math.toRadians(i)));
}
return points;
}

Point originalPosition = null;

public RingShell() {
final Display display = new Display();
final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
shell.setBackground(display.getSystemColor(SWT.COLOR_DARK_MAGENTA));
Region region = new Region();
region.add(createCircle(100, 100, 100));
region.subtract(createCircle(50, 100, 100));
shell.setRegion(region);
// Make the shell movable by using the mouse pointer.
shell.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
shell.dispose(); // Double click to dispose the shell.
}

public void mouseDown(MouseEvent e) {
originalPosition = new Point(e.x, e.y);
}

public void mouseUp(MouseEvent e) {
originalPosition = null;
}
});
shell.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
if (originalPosition == null)
return;
Point point = display.map(shell, null, e.x, e.y);
shell.setLocation(point.x - originalPosition.x, point.y - originalPosition.y);
System.out.println("Moved from: " + originalPosition + " to " + point);
}
});
Rectangle regionBounds = region.getBounds();
shell.setSize(regionBounds.width, regionBounds.height);
shell.open();

// Set up the event loop.
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
// If no more entries in event queue
display.sleep();
}
}
display.dispose();
region.dispose();
}

public static void main(String[] args) {
new RingShell();
}
}


10.Re:SWT控件背景透明问题 [Re: Sunteya] Copy to clipboard
Posted by: Sunteya
Posted on: 2005-04-03 16:28

TO:yipsilon
这段代码产生的是一个镂空的圆环,而我需要的是一个像JPanel一样的东西
是能放到其他的JPanel上的。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923