大家好,我想知道是否有办法在 Gtk::DrawingArea 中添加和定位 Gtk::Widget。我这样做的目的是在单击图形时在绘图区域中显示有关图形的一些详细信息。详细信息可以是丰富的格式。
我知道 Gtk::DrawingArea 没有 add(Widget) 之类的功能。所以我想知道是否有解决方法。
在此先感谢和最好的问候。
陈凯
大家好,我想知道是否有办法在 Gtk::DrawingArea 中添加和定位 Gtk::Widget。我这样做的目的是在单击图形时在绘图区域中显示有关图形的一些详细信息。详细信息可以是丰富的格式。
我知道 Gtk::DrawingArea 没有 add(Widget) 之类的功能。所以我想知道是否有解决方法。
在此先感谢和最好的问候。
陈凯
不确定它有多大帮助,但我通过搜索找到了这个:
Old Nabble - Gtk+ - Python - 在 gtk.drawing 区域上覆盖 gtk 小部件
似乎有一个gtk.Fixed()->put()
功能,但我不知道它是否应该在绘图循环中运行..(编辑:另见GTK v1.2 教程:容器小部件)
干杯!
是的,这是可能的。给你。享受 C 中的代码:
#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;
}