是否可以在GTK绘图区域上绘制GTK窗口小部件,然后更新图形?

问题描述 投票:1回答:1

假设我绘制了一个模型火车布局的线图。更新工程图时,可以更改各种工程图组件的颜色,例如指示警报情况。我想在图中添加几个“开关”小部件,“切换”按钮等,以便我可以使用Raspberry Pi(受工业过程控制启发)来打开/关闭电气项目。这可能吗? ...还是有更好的方法?

一种不同但不那么好的方法是在良好的常规窗口中显示GtkImage图形,然后在图形上方安装小部件。这种方法有效,但是您不能像在Drawing_Area小部件中那样更改单个图形组件的颜色。为了更改图形,您必须进行屏幕截图,然后裁剪图像,然后将图像另存为适当大小的JPEG,然后以某种方式更新GtkImage。

在Drawing_Area上显示小部件会更好。 …有什么想法吗?

gtk3
1个回答
0
投票

这里您是队友。比以往任何时候都更好...;)

#include <gtk/gtk.h>
#include <math.h>

GtkWidget *window;
GtkWidget *layout;
GtkWidget *canvas;

GtkWidget *image;
GtkWidget *eventbox;

static gboolean on_window_draw (GtkWidget *da, GdkEventExpose *event, gpointer data)
{
    GdkWindow *window;
    GdkDrawingContext *drawingContext;
    cairo_region_t *cairoRegion;
    cairo_t *cr;

    cairoRegion = cairo_region_create();
    window = gtk_layout_get_bin_window(GTK_LAYOUT(layout)); 
    drawingContext = gdk_window_begin_draw_frame(window, cairoRegion);
    cr = gdk_drawing_context_get_cairo_context(drawingContext);

    cairo_set_line_width(cr, 9);  
    cairo_set_source_rgb(cr, 0.69, 0.19, 0);

    cairo_translate(cr, 300/2, 200/2);
    cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI);
    cairo_stroke_preserve(cr);

    cairo_set_source_rgb(cr, 0.3, 0.4, 0.6); 
    cairo_fill(cr);

    gdk_window_end_draw_frame(window, drawingContext);
    cairo_region_destroy(cairoRegion);

    return FALSE;
}

int main ( int argc, char **argv) 
{   
    GtkWidget *button;

    gtk_init (&argc , &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (window, 300, 200);
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit) , NULL);

    canvas = gtk_drawing_area_new ();
    layout = gtk_layout_new(NULL,NULL);
    gtk_container_add (GTK_CONTAINER (layout), canvas);
    gtk_container_add (GTK_CONTAINER (window), layout);

    button = gtk_button_new_with_label("I feel alone...");
    gtk_container_add(GTK_CONTAINER(layout), button);
    gtk_layout_move(GTK_LAYOUT(layout), button, 90, 50);
    g_signal_connect (canvas, "draw", (GCallback) on_window_draw, NULL);

    gtk_widget_show_all (window);
    gtk_main ();
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.