How to combine images to use as SWT cursor

女生的网名这么多〃 提交于 2019-12-11 10:40:06

问题


Further to this question where I understand I cannot achieve my goal I have tried to create my own cursor from an image.

In my example I am just trying to draw a green box with

on top.

I expect the result to look like

Here's my code:

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class CursorTest {

    public static void main(String[] args) {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setBounds(10, 10, 200, 200);

        Canvas canvas = new Canvas(shell, SWT.BORDER);
        canvas.setBounds(10, 50, 150, 100);

        canvas.setCursor(CursorTest.getCursor(display, new Color(display, new RGB(0, 255 ,0))));

        shell.open();

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

        display.dispose();
    }

    public static Cursor getCursor(Display display, Color c) {

        ImageDescriptor element = ImageDescriptor.createFromFile(
                ImageProvider.class, "arrow.png");

        Image a = element.createImage();


        int width = a.getBounds().width;
        int height = a.getBounds().height;
        Image image = makeTransparent(new Image(display, width, height));

        GC gc = new GC(image);

        gc.setBackground(c);
        gc.setForeground( display.getSystemColor(SWT.COLOR_BLACK));
        gc.fillRectangle(4, 10, 12, 12);
        gc.drawRectangle(4, 10, 12, 12);
        gc.drawImage(a, 0, 0);


        Cursor result = new Cursor(display, image.getImageData(),
                0, 0);
        gc.dispose();
        image.dispose();

        return result;

    }

    private static Image makeTransparent(Image sourceImage) {
        ImageData data = sourceImage.getImageData();
        data.transparentPixel = data.palette.getPixel(new RGB(255, 255, 255));
        Image ret = new Image(sourceImage.getDevice(), data);
        sourceImage.dispose();
        return ret;
    }

}

As you can see this functions rather oddly and I'm unable to work out why. Can anyone help please?


回答1:


Transparency is quite tricky with SWT. You can use CompositeImageDescriptor to help with this:

public static Cursor getCursor(final Display display)
{
  OverlayImageDescriptor overlay = new OverlayImageDescriptor();

  Cursor result = new Cursor(display, overlay.getImageData(), 0, 0);

  return result;
}

private static class OverlayImageDescriptor extends CompositeImageDescriptor
{
  private final ImageData base;

  OverlayImageDescriptor()
  {
    base = ImageDescriptor.createFromFile(ImageProvider.class, "arrow.pnh").getImageData();
  }

  @Override
  protected void drawCompositeImage(int width, int height)
  {
    Display display = Display.getCurrent();

    // Overlay image

    Image image = new Image(display, 13, 13);

    GC gc = new GC(image);

    Color color = new Color(display, new RGB(0, 255 ,0));

    gc.setBackground(color);
    gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
    gc.fillRectangle(0, 0, 12, 12);
    gc.drawRectangle(0, 0, 12, 12);

    gc.dispose();
    color.dispose();

    drawImage(image.getImageData(), 3, 3);

    image.dispose();

    // Draw base image over the top of the overlay

    drawImage(base, 0, 0);
  }

  @Override
  protected Point getSize()
  {
    return new Point(base.width, base.height);
  }

}



来源:https://stackoverflow.com/questions/31166262/how-to-combine-images-to-use-as-swt-cursor

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!