簡體   English   中英

具有半透明背景的畫布

[英]Canvas with a semi-transparent background

我想創建一個具有半透明背景的畫布。 所以我嘗試過這樣的事情:

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main {

    public static int WIDTH=500;
    public static int HEIGHT=70;
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell(display);
        shell.setSize(WIDTH,HEIGHT);
        shell.setLayout(new GridLayout());
        shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
        create(shell);


        shell.pack();
        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }


    private static void create(Shell shell){
        Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
        GridData gd= new GridData();
        gd.heightHint=HEIGHT-30;
        gd.widthHint=WIDTH-30;
        c.setLayoutData(gd);
        c.setBackgroundMode(SWT.INHERIT_FORCE);
        c.setBackground(new Color(shell.getDisplay(), 255, 255, 255, 100));
    }

}

但是SWT似乎沒有考慮我用於“畫布”背景的顏色的Alpha部分(100),除非我輸入0,否則如果使用0,則畫布是完全透明的,在所有其他情況下,不透明。 我在這里犯了一些錯誤,還是SWT問題?

我在Windows 8上使用SWT。

正如greg-449指出的,這是Windows環境下SWT中的錯誤。 我在SWT中打開了一個缺陷: https : //bugs.eclipse.org/bugs/show_bug.cgi? id =528249

作為一種解決方法,我們總是可以自行設置GC繪畫畫布上的aplha,這種方法適用於所有環境:

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main {

    public static int WIDTH=500;
    public static int HEIGHT=70;
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell(display);
        shell.setSize(WIDTH,HEIGHT);
        shell.setLayout(new GridLayout());
        shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
        create(shell);


        shell.pack();
        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }


    private static void create(Shell shell){
        Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
        GridData gd= new GridData();
        gd.heightHint=HEIGHT-30;
        gd.widthHint=WIDTH-30;
        c.setLayoutData(gd);
        c.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TRANSPARENT));
        c.setBackgroundMode(SWT.INHERIT_FORCE);
        c.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                Rectangle clientArea = c.getClientArea();
                e.gc.setAlpha(100);
                e.gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
                e.gc.fillRectangle(clientArea.x,clientArea.y,clientArea.width-1,clientArea.height-1);
            }
        });
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM