this.canvas = new Canvas(shell, SWT.NO_BACKGROUND);
我正在使用一个PaintListener:
this.canvas.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { // Draw images synchronized (imageMarks) { for (ImageMark mark : Whiteboard.this.imageMarks) { Image image = Whiteboard.this.getImage(mark.id); Point position = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), mark.getPosition()); Point bounds = mark.getUnscaledBoundaries(Whiteboard.this.getCanvasSize()); e.gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, position.x, position.y, bounds.x, bounds.y); } } // Draw pencil marks synchronized (pencilMarks) { e.gc.setLineWidth(LINE_WIDTH); for (double[] line : Whiteboard.this.pencilMarks) { Point lastPosPoint = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), new ScaledPoint(line[0], line[2])); Point newPosPoint = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), new ScaledPoint(line[1], line[3])); e.gc.drawLine(lastPosPoint.x, lastPosPoint.y, newPosPoint.x, newPosPoint.y); } } // Draw pointer, assuming it's there if (pointerMark != null) { synchronized (pointerMark) { Point pos = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), pointerMark.getPosition()); if (pointerMark.isFlipped()) e.gc.drawImage(Whiteboard.pointerImageFlipped, pos.x, pos.y); else e.gc.drawImage(Whiteboard.pointerImage, pos.x, pos.y); } } } });
并通过canvas.redraw()调用重绘canvas。 在64位的Linux上,这似乎没有任何问题,但奇怪的是,在64位Windows上,没有任何事情最终被抹去或重绘。 例如,如果屏幕被resize,铅笔标记也不会resize,它们最终会被剪切掉。 添加新标记(换句话说,当再次调用绘画监听器时),重新定位的标记重新绘制在旧窗口上,而窗口并不随窗口缩放。 换句话说,我相信canvas.redraw()不会清除canvas。 有没有解决方法?
您正在指定SWT.NO_BACKGROUND,这会在每次绘制之前停止Canvas被清除。
如果使用SWT.NO_BACKGROUND,绘制方法的职责是绘制画布的每个像素。
SWT.NO_BACKGROUND JavaDoc:
默认情况下,在部件绘制之前,客户区域将填充当前背景。 指定此样式时,背景未填充,应用程序负责填充客户区域的每个像素。 这种风格可能会被用来替代“双缓冲”来减少闪烁。 这种风格并不意味着“透明” – 被遮挡的小部件将无法通过。