|
楼主 |
发表于 2005-11-30 15:17:22
|
显示全部楼层
Post by luma
自绘界面,绘制时调整alpha值,alpha越小,透明度越高
用下面的代码在Canvas上面绘制。有问题,如附件图,第一幅是程序刚刚启动运行的时候,一切正常,然而在调整窗口大小之后,图像就如图二了,乱了,只能最小化然后恢复才能使窗口绘制正常。求助,如何做能解决这个问题?
还有一点奇怪的,我只能使用canvas绘制,如果将绘制直接放在shell也就是窗口上,就完全没有效果。怀疑窗口重新绘制事件首先把窗口背景颜色画上去了,才调用paintlistener。可是为什么放在canvas上就可以?疑惑,大大的疑惑。难道用canvas覆盖主窗口后(用的fill layout摆放的canvas),主窗口就完全不重绘了?
另外,目前用alpha控制透明的代码和我最终想要达到的还有一点差距,顶楼附件现实的那个效果更好一点:当透明窗口所覆盖下面的窗口内容发生变化时(比如电影播放窗口),也能反映出来。可是覆盖的窗口发生变化时,目前窗口不会接到绘制事件,也就不能反映后面窗口的变化。所以,效果还缺一点点。
我的代码如下:
- import org.eclipse.swt.*;
- import org.eclipse.swt.graphics.*;
- import org.eclipse.swt.layout.FillLayout;
- import org.eclipse.swt.widgets.*;
- import org.eclipse.swt.events.*;
- public class Talpha {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- final Display display = new Display();
- final Shell shell = new Shell(display);
- Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND);
- //使用paintlistener,保证每次均重新绘制。
- canvas.addPaintListener(new PaintListener() {
- public void paintControl(PaintEvent e) {
- GC gc = e.gc;
- //读图像
- ImageData imageData = new ImageData("imgs/pt.jpg");
- //这里是建立从左到右的渐进Alpha。
- byte[] alphaValues = new byte[imageData.height * imageData.width];
- for (int j = 0; j < imageData.height; j++) {
- for (int i = 0; i < imageData.width; i++) {
- alphaValues[j * imageData.width + i] = (byte) (255 - 255
- * i / imageData.width);
- }
- }
- imageData.alphaData = alphaValues;
- Image image = new Image(display, imageData);
- //绘制
- gc.drawImage(image,0,0);
- }
- });
- FillLayout fillLayout = new FillLayout();
- fillLayout.type = SWT.VERTICAL;
- shell.setLayout(fillLayout);
- shell.setSize(200, 600);
- shell.open();
- while (!shell.isDisposed()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- display.dispose();
- }
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|