2

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;
  }
4

1 に答える 1

5

通常、描画するときは次の 2 つの選択肢があります。

  1. 描画されたコンテンツを利用可能なサイズに適応させたい場合、そのためにcairo_scaleを使用します
  2. または、現在行っているように、スクロール ビューを使用します。

ケース 2 の場合、Cairo は、あなたが範囲外に描画していることを知る方法がありません。また、場合によっては、範囲外の描画が必要になることさえあります。ここで欠けているのは、描画領域のサイズを設定することです。これはgtk_widget_set_size_requestを使用して行うことができます。

于 2012-09-19T09:18:18.907 に答える