我有GtkDrawingArea
用于可视化数据。
根据数据库和用户输入,绘图可能会变得非常大(大于允许的最大GtkDrawingArea
大小)。因此,我想使用与当前窗口一样大的绘图区域,并在滚动时手动更新。
如果我使用ScrolledWindow + Viewport方法将滚动条添加到绘图区域,它显然不起作用,因为绘图区域不够大,不需要滚动条。
有没有什么方法可以让视口欺骗认为底层小部件比实际大? 如果不是解决这个问题的最佳方法是什么?
注意:我正在使用Gtk2并且不可能切换到Gtk3。
答案 0 :(得分:2)
您需要继承GtkDrawingArea
并覆盖set_scroll_adjustments
信号。 GtkWidget docs
在此信号中,您将获得滚动窗口的调整。几年前我写了一些代码,你可以看一下如何实现它。
此代码能够假装窗口小部件的宽度为数百万像素,而实际上它并不比窗口大。
答案 1 :(得分:0)
结果很简单:
GtkScrolledWindow
有另一个构造函数,可用于设置滚动窗口应使用的GtkAdjustments
。
//These adjustments will be attached to the scrollbars.
prvt->hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
prvt->vAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
GtkWidget* scrolledTree = gtk_scrolled_window_new(prvt->hAdjustment, prvt->vAdjustment);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledTree), drawing_area);
现在,只要图形大小发生变化,您只需修改GTKAdjustments
即可模拟更改。无需实际调整绘图区域的大小。
gtk_adjustment_set_lower(prvt->hAdjustment, 0);
gtk_adjustment_set_step_increment(prvt->hAdjustment, 1);
gtk_adjustment_set_page_increment(prvt->hAdjustment, 10);
gtk_adjustment_set_upper(prvt->hAdjustment, picture_width);
gtk_adjustment_set_page_size(prvt->hAdjustment, scrollArea_width);
gtk_adjustment_changed(prvt->hAdjustment);
请注意,我最后会调用gtk_adjustment_changed
。这很重要,否则ScrolledWindow
将不会更新滚动条。
最后,value_changed
的{{1}}回调可用于捕捉滚动事件并调整绘图。
编辑:由于GtkAdjustmens
收到滚动事件,因此无法正常工作
以及移动图像:(