2

我有一个 SWT Canvas,上面有一些图像。我希望我的用户通过单击、按住鼠标左键并通过移动鼠标打开选择框来选择图像的一部分。作为视觉反馈,我想将选定的矩形显示为图像上的透明覆盖。

问题是我不知道如何最好地实现这一目标?有人可以给我一个提示吗?

4

2 回答 2

3

我的答案与我在这里给出的答案有些相似:

SWTChart 鼠标事件处理

下面的代码应该让您知道从哪里开始。它基本上记住了MouseDown事件的位置。每次拖动鼠标时,都会从起始位置到当前位置绘制一个矩形。一旦MouseUp发生,一切都会停止。

public class DrawExample
{
    private static boolean drag = false;
    private static int startX;
    private static int startY;
    private static int endX;
    private static int endY;

    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Drawing Example");

        final Canvas canvas = new Canvas(shell, SWT.NONE);
        canvas.setSize(150, 150);
        canvas.setLocation(20, 20);
        shell.open();
        shell.setSize(200, 220);

        canvas.addListener(SWT.MouseDown, new Listener() {

            @Override
            public void handleEvent(Event event) {
                startX = event.x;
                startY = event.y;

                drag = true;
            }
        });

        canvas.addListener(SWT.MouseUp, new Listener() {

            @Override
            public void handleEvent(Event event) {
                endX = event.x;
                endY = event.y;

                drag = false;

                canvas.redraw();
            }
        });

        canvas.addListener(SWT.MouseMove, new Listener() {

            @Override
            public void handleEvent(Event event) {
                if(drag)
                {
                    endX = event.x;
                    endY = event.y;

                    canvas.redraw();
                }
            }
        });

        canvas.addListener(SWT.Paint, new Listener() {

            @Override
            public void handleEvent(Event event) {
                if(drag)
                {
                    GC gc = event.gc;

                    gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
                    gc.setAlpha(128);

                    int minX = Math.min(startX, endX);
                    int minY = Math.min(startY, endY);

                    int maxX = Math.max(startX, endX);
                    int maxY = Math.max(startY, endY);

                    int width = maxX - minX;
                    int height = maxY - minY;

                    gc.fillRectangle(minX, minY, width, height);
                }
            }
        });

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

它看起来像这样:

在此处输入图像描述

于 2012-11-23T10:07:21.590 回答
0

本机平台提供了另一种方法来执行此操作。使用 SWTorg.eclipse.swt.widgets.Tracker

如何通过拖动角来调整合成的大小

于 2012-11-23T17:12:27.620 回答