【问题标题】:Is it possible to draw a GTK widget on a GTK drawing area?是否可以在 GTK 绘图区域上绘制 GTK 小部件?
【发布时间】:2017-11-17 15:35:20
【问题描述】:

我最近迁移到 Linux 并尝试使用 Ruby GTK3 开发桌面应用程序。我希望能够将 Glade 文件渲染到 DrawingArea 上(向用户预览 Glade 文件中的窗口是什么样的)。

这可能吗?例如,是否可以在 GTK 绘图区/画布上绘制 GTK 按钮或窗口。我猜是这样,我认为这就是 Glade 应用程序所做的,但我不知道从哪里开始研究。

任何指针将不胜感激。

【问题讨论】:

  • 为什么您和/或用户不能在 Glade 中打开 Glade 文件?
  • 他们可以,但这不是问题...
  • 为什么它必须是一个绘图区?只需加载 glade 文件并将加载的小部件放入您的 GUI...
  • 为什么不创建一个窗口而不是在某个画布中渲染它呢?另一种选择是 Gtk Fixed。使用绘图区域将公开一个 cairo 上下文,其目标是绘制新的小部件。如果没有对具体目标的更好解释,我们将无能为力,imo。
  • 您可以看看 Glade 中的预览模式是如何完成的。

标签: ruby gtk gtk3 glade


【解决方案1】:

是的,格莱德一点也不乱。迟到比以往任何时候都好。希望其他人可以享受它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2023-03-21
    • 1970-01-01
    • 2012-01-07
    • 2022-07-28
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多