Swt 插入符导致重绘整个 canvas
Swt caret causes redraw of the entire canvas
我有一个 Canvas 用来画画。为了利用 canvas 我添加了
canvas.addPaintListener(paintEvent-> {
// Misc drawing code here.
});
然后我用
向 canvas 添加一个插入符
Caret c = new Caret(canvas,SWT.None);
c.setBounds(10, 10, 2, 12);
这很好用,我可以在此处的 // Misc 绘图代码点的 canvas 上绘图。
但是问题来了:
每次插入符号闪烁时,它都会发送一个绘制事件。这是有道理的,因为我需要重新绘制插入符号下的内容。但它不是只清除插入符号周围的区域,而是清除整个 canvas。而如果我在paintEvent中查看x,y,width,height,那么x和y都是0,而width和height对应的是canvas.
的大小
那么如何获取插入符,只更新它覆盖的区域,而不是整个 canvas?每次插入符号闪烁时重新绘制整个 canvas 有点贵。
添加:
我使用 Eclipse 来开发应用程序。如果我设置
SWT_GTK3=0 在我的应用程序的 运行 环境中,应用程序不会在每次光标闪烁时重新绘制背景。所以它看起来像一个 swt+gtk3 问题。
在创建 Canvas
时设置 SWT.NO_BACKGROUND
样式以停止默认清除每个绘画上的 canvas。
paint事件中的GC
应该有一个裁剪区域设置告诉你需要重绘的最小区域:
Rectange clipping = paintEvent.gc.getClipping();
您可以使用它来检查 canvas 的哪些部分需要重绘。
我有一个 Canvas 用来画画。为了利用 canvas 我添加了
canvas.addPaintListener(paintEvent-> {
// Misc drawing code here.
});
然后我用
向 canvas 添加一个插入符Caret c = new Caret(canvas,SWT.None);
c.setBounds(10, 10, 2, 12);
这很好用,我可以在此处的 // Misc 绘图代码点的 canvas 上绘图。
但是问题来了: 每次插入符号闪烁时,它都会发送一个绘制事件。这是有道理的,因为我需要重新绘制插入符号下的内容。但它不是只清除插入符号周围的区域,而是清除整个 canvas。而如果我在paintEvent中查看x,y,width,height,那么x和y都是0,而width和height对应的是canvas.
的大小那么如何获取插入符,只更新它覆盖的区域,而不是整个 canvas?每次插入符号闪烁时重新绘制整个 canvas 有点贵。
添加: 我使用 Eclipse 来开发应用程序。如果我设置 SWT_GTK3=0 在我的应用程序的 运行 环境中,应用程序不会在每次光标闪烁时重新绘制背景。所以它看起来像一个 swt+gtk3 问题。
在创建 Canvas
时设置 SWT.NO_BACKGROUND
样式以停止默认清除每个绘画上的 canvas。
paint事件中的GC
应该有一个裁剪区域设置告诉你需要重绘的最小区域:
Rectange clipping = paintEvent.gc.getClipping();
您可以使用它来检查 canvas 的哪些部分需要重绘。