Hozzászólások
Sziasztok!
Mostanában el kezdtem gdk-t használó programokat írni, de már egyből problémákba is akadtam, kettőt fel is sorolnék:
Nem értem hogy mi a különbség a GdkPixmap és a GdkPixbuf struktúrák között (a forrást én is meg tudom nézni de arra lennék kíváncsi hogy használatukban mi a különbség).
Másik gondom az, hogy ha egy gdk_draw_pixbuf függvénynek GdkDrawable gyanánt a window->window-ot adom meg, akkor az miért nem működik, miért kell egy background-nak beállított GdkPixmap-et használni ehhez.
Na és egy utolsó: gdk-ban miért van mindennek a logikával ellentétes sorrendje, például miért a gdk_gc_set_clip_mask()-ot hívjuk meg először, aztán a gdk_gc_set_clip_origin()-t, miért nem fordítva.
Ha ezekre valaki nekem adna válaszokat akkor megköszönném.
Laci
- A hozzászóláshoz be kell jelentkezni
[quote:47a827cca6="lacipac"]Sziasztok!
Mostanában el kezdtem gdk-t használó programokat írni, de már egyből problémákba is akadtam, kettőt fel is sorolnék:
Nem értem hogy mi a különbség a GdkPixmap és a GdkPixbuf struktúrák között (a forrást én is meg tudom nézni de arra lennék kíváncsi hogy használatukban mi a különbség).
Másik gondom az, hogy ha egy gdk_draw_pixbuf függvénynek GdkDrawable gyanánt a window->window-ot adom meg, akkor az miért nem működik, miért kell egy background-nak beállított GdkPixmap-et használni ehhez.
Na és egy utolsó: gdk-ban miért van mindennek a logikával ellentétes sorrendje, például miért a gdk_gc_set_clip_mask()-ot hívjuk meg először, aztán a gdk_gc_set_clip_origin()-t, miért nem fordítva.
Ha ezekre valaki nekem adna válaszokat akkor megköszönném.
Laci
Nos. Nem vagyok nagy GDK expert, de GTK-ba viszonylag sokat programoztam. Konkret megoldast nem irok :)
De javaslom a GDK API atbongeszeset (nem a forraset :) ) talan az segit,
http://developer.gnome.org/doc/API/2.0/gdk/index.html
Valamint javaslom az irc.gimp.org -> #gtk+ nevu csatornat. Ha okosan kerdez az ember es nem tunik lamanak :) es turelmes, akkor szoktak valaszolni es segitokeszek. Sok problemara talaltam mar "naluk" megoldast.
Ennyit tudok hirtelen javasloni. :)
udv
-krix-
- A hozzászóláshoz be kell jelentkezni
Annak a 68 embernek aki megnézte a topicot: A
[code:1:c4398f2971]gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
...
gdk_gc_set_clip_mask(gc, mask);
gdk_gc_set_clip_origin(gc, 5, 5);
[/code:1:c4398f2971]függvények feleslegesek voltak, és utána a pixbufalpha-t kellett kirajzolni.
- A hozzászóláshoz be kell jelentkezni
GDK API-t mostanában elég nagy rendszerességgel olvasgattam, de sokra nem jutottam vele.
Megkérdezek valakit a #gtk+-on.
- A hozzászóláshoz be kell jelentkezni
Mivel a #gtk+-on nem nagyon válaszoltak jó idő elteltével sem, ezért megkérdezem itt. Van a következő program, amivel a program végén a gdk_draw_drawable függvénnyel a pixmap-ot ki tudom rajzolni és működik a maszk is, de amint gdk_draw_pixbuf()-fal rajzolnám ki a pixbuf -ot akkor kirajzolja ugyan, de maszkot nem húz reá. Valaki aki tudja miért kérem informáljon fel.
Szóval a program:
[code:1:6325e19b57]
#include <gtk/gtk.h>
GtkWidget *window;
GdkPixmap *bg;
GdkGC *gc;
static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
g_print ("delete event occurred\n");
return FALSE;
}
static void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}
int main(int argc, char **argv)
{
GdkPixmap *pixmap;
GdkPixbuf *pixbuf, *pixbufalpha;
GdkBitmap *mask;
gtk_init(&argc, &argv);
gtk_set_locale();
pixbuf = gdk_pixbuf_new_from_file("main.png", NULL);
if (pixbuf == NULL) {
g_printerr("error loading file \n");
return 1;
}
pixbufalpha = gdk_pixbuf_add_alpha(pixbuf, TRUE, 0xFF, 0, 0xFF);
gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
g_object_unref(pixbufalpha);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_realize(window);
if (window == NULL) {
g_printerr("window null\n");
return 1;
}
if (window->window == NULL) {
g_printerr("window->window NULL\n");
return 1;
}
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_widget_set_app_paintable(window, TRUE);
g_signal_connect(G_OBJECT(window), "delete_event",
G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(destroy), NULL);
gc = gdk_gc_new(window->window);
bg = gdk_pixmap_new(window->window,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf),
gdk_visual_get_best_depth());
gtk_widget_set_usize(window,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf));
gdk_draw_pixbuf(bg, gc, pixbuf, 0, 0, 0, 0, -1, -1, 0, 0, 0);
gdk_window_set_back_pixmap(window->window, bg, FALSE);
gtk_widget_shape_combine_mask(window, mask, 0, 0);
pixbuf = gdk_pixbuf_new_from_file("exit.png", NULL);
if (pixbuf == NULL) {
g_printerr("error loading file \n");
return 1;
}
mask= NULL;
pixbufalpha = gdk_pixbuf_add_alpha(pixbuf, TRUE, 0xFF, 0, 0xFF);
gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
if (mask == NULL)
g_printerr("mask\n");
gdk_gc_set_clip_mask(gc, mask);
gdk_gc_set_clip_origin(gc, 5, 5);
gdk_draw_pixbuf(bg, gc, pixbuf, 0, 0, 5, 5, -1, -1, 0, 0, 0);
// g_object_unref(pixbufalpha);
// g_object_unref(mask);
// g_object_unref(pixbuf);
gtk_widget_show(GTK_WIDGET(window));
gtk_main();
return 0;
}
[/code:1:6325e19b57]
EDIT: És légyszi ne azt írjátok hogy "És miért nem jó a pixmap kirajzolása?" mert egy működő programban is így van megoldva és nagyon nem értem nálam miért nem működik. Köszi :wink:
- A hozzászóláshoz be kell jelentkezni