5

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

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

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

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

4

2 回答 2

2

您需要子类GtkDrawingArea化并覆盖set_scroll_adjustments信号。GtkWidget 文档

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

MarlinSample查看代码

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

于 2013-03-17T01:15:54.097 回答
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回调来捕获滚动事件并调整绘图。GtkAdjustmens

编辑:这不能正常工作,因为GtkScrolledWindow接收滚动事件以及移动图像:(

于 2013-03-15T08:34:14.873 回答