[英]Freehand drawing Gtk / set_event_compression(false) does not work
我正在使用GTK +(gtkmm)开发图形软件,并希望构建免费的手绘图功能。
我连接到Gtk::EventBox
signal_motion_notify_event
上的set_event_compression
,并在事件框中将set_event_compression
设置为false
。 我还在包含事件框的窗口上设置了set_event_compression(false)
,但似乎没有任何效果。 该程序运行不流畅,无法绘制槽线,而是出现多个单点或短划线。
我还尝试在额外的thread
使用Gdk::Window::get_pointer(int,int,Gdk::ModifierType)
,但这也不起作用(也无法通过线条绘制)。
这是一些示例代码来说明(我使用Gtk::Image
-class绘制pixbuf):
工具箱
// eb means EventBox
Gtk::EventBox& eb = drawingWin->getEventBox();
eb.signal_motion_notify_event().connect(sigc::mem_fun(image, &Image::motionEvent));
DrawingWindow.cc
DrawingWindow::DrawingWindow(int x, int y) : area(x, y), background("/home/tux/Pictures/Arch_Linux_Wallpaper_by_james66.jpg")
{
// eb means EventBox
eb.get_window()->set_event_compression(false);
}
Image.cc
bool Image::motionEvent(_GdkEventMotion* event)
{
if(event)
{
mutex.lock();
//custom set_pixel function on Gdk::Pixbuf using guint8* Gdk::Pixbuf::get_pixels() const
this->set_pixel(event->x, event->y, 0x000000ff);
//updates the Gtk::Image by calling Gtk::Image::set(Glib::RefPtr<Gdk::Pixbuf>)
this->_udpate();
mutex.unlock();
}
}
在GIMP(最初是为GTK +编写的程序)中,如果鼠标移动得太快,则单点之间也会有间隙,这些间隙之间会填充直线。
在GTK +和gtkmm中,有Gdk::EventMask
。 可以使用Gtk::Widget::set_events(Gdk::EventMask)
。 需要确保设置了POINTER_MOTION_MASK
(不是POINTER_MOTION_HINT_MASK
)。
还需要确保禁用事件压缩。 在包括GTK3之前,可以使用Gdk::Window::set_event_compression(false)
在GTK4中,事件压缩始终处于打开状态:
使用GTK4,需要查看运动事件之间的事件历史记录,以重建合并的事件。 在gtk4中,事件传递速率固定为由帧时钟运行(即60hz)。
get_motion_history()
(函数名称可能已更改)将仅返回在处理该帧期间累积的运动坐标。
这是两个示例:
所有这些示例都缺乏连贯性(线条之间存在间隙)。
没有插值功能,就不可能使用GTK +构建更丰富的自由手绘图!
还有一个使用Qt5的示例 ,它是连贯的: Qt5 Scribble
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.