c - GtkDrawingArea 与 Cairo - 如何使其可滚动

标签 c scroll gtk cairo

下面是一段使用 cairo 绘制内容的小代码。问题是cairo绘制的canvas比gtk的scrolled_window的面积要大。但是scrolled_window不会滚动,所以我只能看到 Canvas 的一部分。

有什么建议吗?我的环境:MinGW + gtk2.10.11。

#include <gtk/gtk.h>

static gboolean draw_cb (GtkWidget *widget, GdkEventExpose *event) 
{
  cairo_t *cr;
  cr = gdk_cairo_create (widget->window);
  cairo_set_source_rgb(cr, 1, 1, 1);
  cairo_paint(cr);
  cairo_set_source_rgb (cr, 0.42, 0.65, 0.80);
  cairo_set_line_width (cr,6);
  cairo_rectangle (cr, 30, 30, 100, 100);
  cairo_stroke (cr); 
  cairo_destroy(cr);
  return FALSE;
}

int main (int argc, char *argv[])
{
  gtk_init (&argc, &argv);
  GtkWidget *window;
  GtkWidget *sw;
  GtkWidget *cr;

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_policy((GtkWindow *)window, FALSE, FALSE, FALSE);
  sw = gtk_scrolled_window_new (NULL,NULL);
  gtk_widget_set_usize(sw, 100, 100);
  cr = gtk_drawing_area_new();

  gtk_scrolled_window_add_with_viewport(GTK_CONTAINER(sw), cr);
  gtk_container_add (GTK_CONTAINER(window), sw);

  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (cr, "expose-event", G_CALLBACK(draw_cb),  NULL);

  gtk_widget_show_all (window);
  gtk_main ();
  return 0;
  }

最佳答案

通常,绘图时您有两种选择:

  1. 您希望绘制的内容适应可用尺寸,并为此使用 cairo_scale
  2. 或者您使用 ScrollView ,就像您正在做的那样。

在情况 2 中,开罗无法知道您正在出界。在某些情况下,出界甚至是您想要的。所以这里缺少的是设置绘图区域的大小。这可以使用 gtk_widget_set_size_request 来完成.

关于c - GtkDrawingArea 与 Cairo - 如何使其可滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12490400/

相关文章:

c - 使用 gdb 进入 GNU 函数

c - R:使用带有 .Call 和 C/C++ 包装器而不是 .Fortran 的 Fortran 子例程的优点?

javascript - 将变量 'left' 传递给 jQuery animate()

c - 为什么使用 -lpthread 隐式声明 pthread_yield 而使用 -pthread 则一切正常?

c++ - C/C++编译器可以报告结构成员偏移量吗

html - 在 HTML 滚动之后的网页上创建静态工具栏

html - 在保留滚动功能的同时删除滚动条

c++ - gtkmm 状态图标在创建后退出

python - GtkAboutDialog 关闭按钮错误

c++ - GTK+/Gtkmm,检查notebook标签页是否已经存在,不存在才创建