Portál AbcLinuxu, 10. května 2025 03:25

Dotaz: Kreslení do GtkFixed

Luboš Doležel (Doli) avatar 16.8.2005 15:39 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Kreslení do GtkFixed
Přečteno: 85×
Odpovědět | Admin
Ahoj,

řeším jeden problém s GTK. Potřebuju mít plochu, na kterou můžu něco vykreslovat a uprostřed té plochy bude ScrolledWindow s TreeView uvnitř.

Napadlo mě použít GtkFixed a umístit do něj ten ScrolledWindow. Jenže při kreslení do GtkFixed se objevil problém: pokud při expose event vykreslím něco na pozici X=5,Y=5, tak se sice objekt vykreslí na tuto pozici, ale relativně k toplevel oknu, ne k tomu GtkFixed.

Chci se proto zeptat: je nějaký "správný" postup jak vyřešit požadavek definovaný v prvním odstavci?

Díky
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 16.8.2005 16:36 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem to zatím vyřešil tak, že veškeré vykreslování je posunuté podle pozice GtkFixed, ale během toho jsem zjistil, že veškerá volání GC::offset() jsou ignorována, takže musím samotný posun provádět sám.
16.8.2005 17:48 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Odpovědět | | Sbalit | Link | Blokovat | Admin
GtkFixed je no-window widget, takže se kreslí na okno rodiče...
#include <gtk/gtk.h>

static gboolean
exposed(GtkWidget *fixed,
        G_GNUC_UNUSED GdkEventExpose *event)
{
    GdkGC *gc = gdk_gc_new(fixed->window);
    GtkAllocation *alloc = &fixed->allocation;

    gdk_draw_line(fixed->window, gc,
                  alloc->x, alloc->y,
                  alloc->x + alloc->width, alloc->y + alloc->height);
    g_object_unref(gc);

    return FALSE;
}

int
main(int argc, char *argv[])
{
    GtkWidget *window, *frame, *fixed;

    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_set_border_width(GTK_CONTAINER(window), 40);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    frame = gtk_frame_new(NULL);
    gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
    gtk_container_add(GTK_CONTAINER(window), frame);

    fixed = gtk_fixed_new();
    g_printerr("GtkFixed is: %s\n",
               GTK_WIDGET_NO_WINDOW(fixed) ? "NO_WINDOW" : "WINDOW");
    gtk_widget_set_size_request(fixed, 200, 100);
    g_signal_connect(fixed, "expose-event", G_CALLBACK(exposed), NULL);
    gtk_container_add(GTK_CONTAINER(frame), fixed);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
Luboš Doležel (Doli) avatar 16.8.2005 21:19 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Ve zdrojáku GTK+ vidím, jak si flag NO_WINDOW nastavuje v gtk_fixed_init(), ale v gtk_fixed_realize() počítá i s možností, že není NO_WINDOW. Mám nějakou šanci mu ten flag změnit před tím, než se mu zavolá realize?
16.8.2005 21:28 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Jistě. Stačí kdekoli mezi vytvořením a realizací (typicky vyvolanou gtk_widget_show()) provést
GTK_WIDGET_UNSET_FLAGS(fixed, GTK_NO_WINDOW);
Luboš Doležel (Doli) avatar 16.8.2005 21:50 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Díky moc. Už to všechno chodí dle mých představ.
Luboš Doležel (Doli) avatar 16.8.2005 21:31 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
Odpovím si sám. gtk_fixed_set_has_window()
16.8.2005 21:59 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Kreslení do GtkFixed
No vida, on na to dokonce má metodu ;-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.