繁体   English   中英

GtkDrawingArea与开罗-如何使其可滚动

[英]GtkDrawingArea with Cairo - how to make it scrollable

接下来是使用cairo绘制东西的小代码。 问题在于,cairo绘制的画布大于gtk的scrolled_window区域。 但是scrolled_window不会滚动,因此我只能看到画布的一部分。

有什么建议吗? 我的环境: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. 或者您正在使用滚动视图。

在第2种情况下,开罗无法得知您正在越界。 在某些情况下,超越界限甚至是您想要的。 因此,这里缺少的是设置绘图区域的大小。 这可以使用gtk_widget_set_size_request完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM