удалить чертежи, созданные с помощью ГХ, созданные на дисплее SWT - PullRequest
1 голос
/ 04 августа 2011

Я создаю GC на дисплее, а затем делаю некоторые рисунки. У меня вопрос, как мне отрисовать?

Код выглядит так:

final GC gc = new GC(display);
gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
gc.setLineWidth(5);
gc.drawRectangle(rectangle);
gc.dispose();

Контекст: Мне нужно разрешить пользователям выбирать окно из других приложений. Ожидаемое поведение можно увидеть здесь: http://tools.tortoisesvn.net/SendMessage.html Вместо этого Весь мой экран заполнен красными прямоугольниками.

Это нормально для меня, даже если это решение только для Windows.

РЕДАКТИРОВАТЬ: извините, красный мусор остается даже после закрытия моего приложения.

EDIT2: рабочий пример:

public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);

        shell.addListener(SWT.MouseMove, new Listener() {
            @Override
            public void handleEvent(Event event) {
                final Point displayPoint = display.map(shell, null, event.x, event.y);
                final POINT point = new POINT();
                point.x = displayPoint.x;
                point.y = displayPoint.y;
                final int windowHandle = OS.WindowFromPoint(point);
                if (windowHandle != 0 && windowHandle != shell.handle) {
                    RECT rect = new RECT();
                    if (OS.GetWindowRect(windowHandle, rect)) {
                        Rectangle rectangle = new Rectangle(rect.left, rect.top, rect.right - rect.left,
                                rect.bottom - rect.top);
                        final GC gc = new GC(display);
                        gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
                        gc.setLineWidth(5);
                        gc.drawRectangle(rectangle);
                        gc.dispose();
                    }
                }
            }
        });

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

Чтобы использовать его, начните перетаскивание мышью из оболочки (не строки заголовка) и наведите его на приложение, которое использует реальные элементы управления Windows (не Swing, QT, XUL). Хорошим примером целевого приложения является Total Commander. Вы увидите, что экран наполняется красными прямоугольниками. В идеале мне бы хотелось, чтобы был виден только один красный прямоугольник.

Я знаю, что мог бы создать новую оболочку с областями, которые будут имитировать красный прямоугольник, но если мышь перепрыгнет через это, я застряну.

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Я делаю код.Это не идеальное решение, потому что после многих попыток я не могу сделать прозрачность всего, кроме границы «окна», поэтому я просто делаю всю оболочку (которая покрывает область «окна») частично прозрачной (и это хорошоэффект хотя).

Вот код

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.POINT;
import org.eclipse.swt.internal.win32.RECT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class ShellBorder {

    private Display display = new Display();
    private Shell shell = new Shell(display);
    private RECT currRect = null;
    private Shell paintShell = null;

    public ShellBorder() {

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

            @Override
            public void handleEvent(Event event) {
                paintShell.dispose();

                // do whatever you need
                // ...

                currRect = null;
            }
        });

        shell.addListener(SWT.MouseMove, new Listener() {
            @Override
            public void handleEvent(Event event) {
                final Point displayPoint = display.map(shell, null, event.x, event.y);
                final POINT point = new POINT();
                point.x = displayPoint.x;
                point.y = displayPoint.y;
                if(currRect == null) {
                    getWindowAndDrawBorder(point);
                } else {
                    // cursor is outside the current rectangle
                    if (point.x < currRect.left || point.x > currRect.right || point.y < currRect.top || point.y > currRect.bottom) {
                        currRect = null;
                        paintShell.dispose();
                        getWindowAndDrawBorder(point);
                    }
                }
            }

            private void getWindowAndDrawBorder(POINT point) {
                long windowHandle = OS.WindowFromPoint(point);
                if (windowHandle != 0 && windowHandle != shell.handle) {
                    RECT rect = new RECT();
                    if (OS.GetWindowRect(windowHandle, rect)) {
                        currRect = rect;

                        paintShell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
                        paintShell.setLocation(currRect.left, currRect.top);
                        paintShell.setSize(currRect.right - currRect.left, currRect.bottom - currRect.top);
                        paintShell.setLayout(new FillLayout());
                        paintShell.setAlpha(50);

                        Canvas canvas = new Canvas(paintShell, SWT.NO_BACKGROUND);
                        canvas.addPaintListener(new PaintListener() {
                            public void paintControl(PaintEvent e) {
                                GC gc = e.gc;
                                gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
                                gc.setLineWidth(5);
                                gc.drawRectangle(new Rectangle(0, 0, paintShell.getSize().x, paintShell.getSize().y));
                            }
                        });
                        paintShell.open();
                    }
                }
            }
        });

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

    }

    public static void main(String[] args) {
        new ShellBorder();
    }
}
0 голосов
/ 05 августа 2011

В моем первом ответе я предположил, что вы хотите протестировать окно других приложений на рабочем столе.Поскольку это не так, вы должны взглянуть на мой ответ на Как нарисовать дочерние элементы Composite в SWT? , который автоматически обрабатывает перерисовку соответствующих частей, когда прямоугольник должен быть снова удален...

0 голосов
/ 04 августа 2011

Для этого необходимо нарисовать Shell, который покрывает весь экран.При удалении Shell нарисованные прямоугольники удаляются.

Хотя я не знаю, как найти окно под курсором ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...