gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:29:47 26 4
gpt4 key购买 nike

下面是一段使用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 中,Cairo 无法知道您正在画出界。在某些情况下,绘制出界甚至是您想要的。所以在这里,缺少的是设置绘图区域的大小。这可以使用 gtk_widget_set_size_request 来完成.

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com