滚动非常大的GtkDrawingArea

时间:2013-03-14 14:17:32

标签: c++ c gtk gtk2

我有GtkDrawingArea用于可视化数据。 根据数据库和用户输入,绘图可能会变得非常大(大于允许的最大GtkDrawingArea大小)。因此,我想使用与当前窗口一样大的绘图区域,并在滚动时手动更新。

如果我使用ScrolledWindow + Viewport方法将滚动条添加到绘图区域,它显然不起作用,因为绘图区域不够大,不需要滚动条。

有没有什么方法可以让视口欺骗认为底层小部件比实际大? 如果不是解决这个问题的最佳方法是什么?

注意:我正在使用Gtk2并且不可能切换到Gtk3。

2 个答案:

答案 0 :(得分:2)

您需要继承GtkDrawingArea并覆盖set_scroll_adjustments信号。 GtkWidget docs

在此信号中,您将获得滚动窗口的调整。几年前我写了一些代码,你可以看一下如何实现它。

MarlinSampleView code

此代码能够假装窗口小部件的宽度为数百万像素,而实际上它并不比窗口大。

答案 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收到滚动事件,因此无法正常工作 以及移动图像:(