首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Cairo绘制GtkImage

用Cairo绘制GtkImage
EN

Stack Overflow用户
提问于 2022-05-13 08:48:51
回答 1查看 50关注 0票数 0

我尝试了类似的注释(How to create a gtkimage from a cairo contextHow do I create a gtkimage from a cairo surface)中提出的解决方案,但它们对我没有用。

在我的实际程序中,后台任务计算物理模拟的连续状态,每次迭代都应该在图中添加一个点。如果我使用GtkDrawingArea,我将不得不存储所有这些点(事先不知道会有多少点),并在每个抽签信号上绘制所有的内容。所以我的想法是使用一个GtkImage,在这里我只需要在每次迭代中画出一个新的点。

在下面的测试程序中,应该按一下按钮来画一些东西,但是什么也不会发生。有人能指出错误吗?

代码语言:javascript
运行
复制
/* Test for drawing an image with Cairo. To be compiled with:
   gcc -Wall -g gtk_img.c -o gtk_img `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0`
*/

#include <stdio.h>
#include <gdk/gdk.h>
#include <cairo.h>
#include <gtk/gtk.h>

#define BORDER      6
#define WIDTH       100
#define HEIGHT      100

cairo_surface_t *surf;
cairo_t         *cr;
cairo_pattern_t *back, *fore;


/*  Event Handlers
    ==============
*/

static gboolean Delete_Event
       (GtkWidget *widget, GdkEvent *event, gpointer data)
{
    return FALSE;
}

static void Destroy (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

static void Draw_Now (GtkWidget *widget, gpointer data)
{
    printf("Draw button clicked\n");
    cr = cairo_create (surf);
    cairo_set_source (cr, back);
    cairo_paint (cr);
    cairo_set_source (cr, fore);
    cairo_move_to (cr, 0.0, 0.0);
    cairo_line_to (cr, 20.0, 20.0);
    cairo_stroke (cr);
}


/*  Main Program
    ============
*/

int main (int argc, char *argv[])
{
    GtkWidget   *window;
    GtkImage    *img;
    GtkBox      *vbox;
    GtkButton   *button;
    
    // init GTK, make window with vbox
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (G_OBJECT (window), "delete_event",
              G_CALLBACK (Delete_Event), NULL);
    g_signal_connect (G_OBJECT (window), "destroy",
              G_CALLBACK (Destroy), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), BORDER);
    vbox = (GtkBox*)gtk_box_new (GTK_ORIENTATION_VERTICAL, BORDER);
    gtk_container_add (GTK_CONTAINER(window), (GtkWidget*)vbox);

    // make image
    surf = cairo_image_surface_create (CAIRO_FORMAT_RGB24, WIDTH, HEIGHT);
    img = (GtkImage*)gtk_image_new_from_surface (surf);
    gtk_image_clear (img);
    back = cairo_pattern_create_rgb (0.9, 0.9, 0.9);
    fore = cairo_pattern_create_rgb (0.1, 0.1, 0.1);
    gtk_box_pack_start (vbox, (GtkWidget*)img, TRUE, TRUE, FALSE);

    // button
    button = (GtkButton*)gtk_button_new_with_label ("Draw");
    g_signal_connect
       (G_OBJECT (button), "clicked", G_CALLBACK (Draw_Now), NULL);
    gtk_box_pack_start (vbox, (GtkWidget*)button, FALSE, FALSE, FALSE);

    // start GTK
    gtk_widget_show_all (window);
    gtk_main ();
    
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-15 08:31:03

您正在绘制到开罗表面,但是“什么都不知道”,因此不会触发重绘。

触发重绘的随机想法是调用gtk_image_clear(),然后调用gtk_image_set_from_surface()。我敢打赌有更好的方法来做到这一点,但我并不真正了解GTK,对不起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72226820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档