c-Cairo和GTK+,未知平局事件调用和程序停止



我正在与Cairo和GTK3.0合作,我遇到了一些不知道如何解决的问题。

目前我有两个我不知道要解决的怪事。

  1. 每当端子浮动在绘图窗口上时,都会调用绘图事件
  2. 该程序不传递gtk_main();功能

我将在下面提供我的代码,这是非常基本的,基于此:http://zetcode.com/gfx/cairo/cairobackends/,GTK窗口部分。我最终只需要一个窗口,我可以随时在代码中调用draw事件。

#include <cairo.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int xStart;
    int yStart;
    int xEnd;
    int yEnd;
} lineData;
int i = 0;
int gonnaDraw = 0;
lineData *lines;
int lineSize = 0;
/**
 * The drawing with the cairo elements is done here.
 * The new line is saved to an array. 
 * Eventually there should be a loop that draws all lines in the array.
 */
static void do_drawing(cairo_t *cr) {
    printf("I'm endless, somehow.n");
    if(lineSize != 0) { //We only want to draw in the infinite for loop, not before it.
        cairo_set_source_rgb(cr, 255, 0, 0);
        cairo_set_line_width(cr, 1.0);
        lineData newLine = { 10.0 + i, 50.0 + i, 100.0 + i, 50.0 + i };
        //lines[lineSize - 1] = newLine;
        cairo_move_to(cr, newLine.xStart, newLine.xEnd);
        cairo_line_to(cr, newLine.yStart, newLine.yEnd);
        cairo_stroke(cr);
        i = i + 10;
        printf("i: %dn", i);
        gonnaDraw = 1;
    }
}
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) {
    do_drawing(cr);
    return FALSE;
}
int main (int argc, char *argv[]) {
    GtkWidget *window;
    GtkWidget *darea;
    printf("1n");
    gtk_init(&argc, &argv);
    printf("2n");
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    printf("3n");
    darea = gtk_drawing_area_new();
    printf("4n");
    gtk_container_add(GTK_CONTAINER(window), darea);
    printf("5n");
    g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    printf("6n");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 800);
    gtk_window_set_title(GTK_WINDOW(window), "GTK window");
    printf("7n");
    gtk_widget_show_all(window);
    printf("8n");
    gtk_main(); // If I'm removed I got no drawing window.
    printf("9n"); // I do not show up.
    lines = (lineData *) malloc(lineSize * sizeof(lineData));
    for(;;) {
        if(gonnaDraw == 1) {
            lineSize++;
            printf("lineSize: %dn", lineSize);
            lines = (lineData *) realloc(lines, lineSize * sizeof(lineData));
            gtk_widget_queue_draw(window);
            gonnaDraw = 0;
        }
    }
    return 0;
}

采用标准方法编制。

您现在几乎了解了GTK+绘图模型。问题1就是它的结果:当另一个窗口越过你的窗口时,窗口系统告诉GTK+该区域需要重新绘制。这就是我谈到剪辑时的意思
现在,另一部分是理解GTK+事件模型。所有窗口系统都以这样一种方式运行,即当程序处于活动状态时,所有程序都在由组成的循环中运行,从窗口系统获取消息并对其执行gtk_main()就是这样做的。gtk_main()不返回是正常的;它没有';t返回,直到对CCD_ 3的调用。除了在与小部件交互时使用信号执行操作之外,还有两种方法可以";钩入";主循环:g_timeout_add(),它按计划运行函数,g_idle_add(),它在下一个可能的时候运行函数。如果你想经常发生一些事情,前者是有用的;如果您希望工作线程向UI发出更新信号,则后者非常有用。关于主循环的GLib文档将告诉您更多信息。I';I’我仍然不确定你的最终目标是什么,所以我想你可以试着把两者都发挥出来看看会发生什么
–和abs

最新更新