GTK EventBox Bild für Button wird nicht angezeigt
-
Hallo Spezialisten,
-> Sprache C (CodeBlocks auf Windows)
ich habe ein App geschrieben in welcher eine EventBox integriert ist.
Diese EventBox enthält ein Bild für den Button und ein ButtonPressEvent.Die App besteht aus mehreren Teilbildern.
Alle TeilBilder werden perfekt zur App zusammengefügt.
Die App ist mit einem Button ausgestattet, welcher in einer EventBox
liegt.
Alle lib____.dll wurden in den "App-Ordner" eingefügt.Die ganze App funktioniert tadellos. Bis auf eine kleine Sache.
Das ButtonBild, welches in der EventBox liegt, wird nicht angezeigt,
wenn die App auf einem anderen Recher läuft, als dort wo die App
geschrieben wurde.
Das Buttonbild liegt mit im selben "App-Ordner" wie die anderen
Teilbilder.
Die EventBox mit dem ButtonPressEvent funktioniert. Nur eben ohne das Bild für den Button.Hat da jemand´ne Idee?
Im Voraus vielen Dank.
Beitrag melden | Bearbeiten | Löschen |
-
-
miep schrieb:
Crosspost: http://www.mikrocontroller.net/topic/196218#1993332
Ich hoffe ich werde dafür nicht verurteilt.
Ich finde für mein Problem keine Lösung und suche weitreichend Hilfe.Grüße
-
Die Tatsache, dass du meinen Post nur eine Viertelstunde später entdeckt hast, muss dir positiv angerechnet werden.
Wenn es nur auf deinem Rechner läuft, musst du wohl oder übel entweder vergessen haben, das Bild mitzuliefern (scheinbar ist es das nicht) oder du arbeitest mit absoluten Pfadangaben (kann ich nicht überprüfen). Etwas anderes fällt mir gerade nicht ein.
Ich hatte das Problem noch nie und ohne genauere Angaben oder Codeausschnitte kann man wirklich nur raten.
-
Hier mal ein Stueck Code der App.
Evtl faellt dir was auf.
Aber ich denke mit dem Code an sich hat mein Problem nix zu tun.Muss auf dem ZielSystem das GTK-Package installiert sein?
Loesche ich den -bin- Ordner des GTK-Package auf dem Rechner auf dem ich die App geschrieben habe, erhalte ich das gleiche Problem.
-> in der EventBox fehlt das Buttonbild
Alles andere funktioniert tadellos.Der Unterschied, welcher zwischen dem Bild fuer den Button und den Bildern fuer den Hintergrund der App ist, ist das die Bilder fuer den Hintergrund ueber die GrafikLib Cairo initiiert werden.
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <gtk/gtk.h> #include "gtk_w.h" #include "show_dialog.c" #include "view_value.c" #include "copy_file.c" #include "search.c" cairo_surface_t *anzeige_basis; cairo_surface_t *anzeige_cover; cairo_surface_t *anzeige_button_press; static gboolean create_clock_ticks(GtkWidget *widget, GdkEventExpose *event, gpointer data) { cairo_t *cr; cr = gdk_cairo_create(widget->window); unsigned char zahlen [11][4]={"0","10","20","30","40","50","60","70","80","90","100"}; cairo_set_antialias(cr,CAIRO_ANTIALIAS_DEFAULT); double x = 274.5; double y = 325; double radius = 250; int z=0; int inset,i; int count_of_ticks = 180; cairo_set_source_rgba (cr,0, 0, 0, 1); for (i = 220; i < 321; i++){ cairo_save (cr); if (i % 5 == 0){ inset = 0.075 * radius; cairo_set_line_width (cr, 1.); if(i % 10 == 0){ cairo_move_to (cr,x-6 + (radius-35) * cos (i * M_PI / count_of_ticks),y+3 + (radius-35 ) * sin (i * M_PI / count_of_ticks)); cairo_show_text(cr, zahlen[z++]); } } else { inset = 0.05 * radius; cairo_set_line_width (cr, 0.5);// * cairo_get_line_width (cr)); } cairo_move_to (cr,x + (radius - inset) * cos (i * M_PI / count_of_ticks),y + (radius - inset) * sin (i * M_PI / count_of_ticks)); cairo_line_to (cr,x + radius * cos (i * M_PI / count_of_ticks),y + radius * sin (i * M_PI / count_of_ticks)); cairo_stroke (cr); } ///================================================================ /// zeiger stop cairo_set_source_rgba (cr,0,0,0, 1); cairo_arc (cr, x-195.5,y-143,2, 0, 2 * M_PI); cairo_fill(cr); /// gruener bereich cairo_set_source_rgba (cr,0, 1, 0, 0.5); cairo_arc (cr, x,y,radius-80, 220.0 * (M_PI/180.0), 310.0 * (M_PI/180.0)); cairo_set_line_width(cr, 3.5); cairo_stroke(cr); /// roter bereich cairo_set_source_rgba(cr, 1,0,0,0.7); cairo_arc (cr, x,y,radius-80, 310.0 * (M_PI/180.0), 320.0 * (M_PI/180.0)); cairo_set_line_width(cr, 7.5); cairo_stroke(cr); cairo_destroy(cr); return FALSE; } static gboolean time_handler (GtkWidget *widget) { if (widget->window == NULL) return FALSE; gtk_widget_queue_draw(widget); return TRUE; } static gboolean zeiger_animation (GtkWidget *widget, GdkEventExpose *event,gpointer data) { cairo_t *cr; cr = gdk_cairo_create(widget->window); cairo_pattern_t *pat; cairo_set_antialias(cr,CAIRO_ANTIALIAS_DEFAULT); double x = 274.0; double y = 325.0; double radius = 250.0; static gdouble delta = 1.; static gdouble scale = 217.; static int i; cairo_set_source_rgba (cr,0, 0, 0, 1); cairo_set_line_width (cr, 1.5); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_arc (cr, x, y, radius, scale * (M_PI/180.0), scale * (M_PI/180.0)); cairo_line_to (cr, x, y); cairo_stroke (cr); if(scale < end){ scale+=delta; } cairo_destroy(cr); return FALSE; } static gboolean anzeige_basis_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) { cairo_t *cr; cr = gdk_cairo_create (widget->window); cairo_set_source_surface(cr, anzeige_basis, 0, 0); cairo_paint(cr); cairo_destroy(cr); return FALSE; } static gboolean anzeige_cover_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) { cairo_t *cr; cr = gdk_cairo_create (widget->window); cairo_set_source_surface(cr, anzeige_cover, 213, 270); cairo_paint(cr); cairo_destroy(cr); return FALSE; } static void button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) { cairo_t *cr; cr = gdk_cairo_create (widget->window); cairo_set_source_surface(cr, anzeige_button_press, 0, 0); cairo_paint(cr); cairo_destroy(cr); file_copy(); return FALSE; } int main(int argc, char **argv){ anzeige_basis = cairo_image_surface_create_from_png("pictures/anzeige2_basis_extended.png"); anzeige_cover = cairo_image_surface_create_from_png("pictures/anzeige2_cover.png"); anzeige_button_press = cairo_image_surface_create_from_png("pictures/anzeige2_button_press.png"); GtkWidget *event_box, *image_button; gtk_init(&argc, &argv); ///**************** Window ********************************** window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_widget_set_usize (window, 660, 394); gtk_window_set_resizable(window,FALSE); gtk_window_set_title(GTK_WINDOW(window), "Finster"); gtk_container_set_border_width(GTK_CONTAINER(window),2); fixed_h = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), fixed_h); image_button= gtk_image_new_from_file("pictures/anzeige2_button.png"); ///**************** EventBox ******************************** event_box = gtk_event_box_new(); gtk_fixed_put(GTK_FIXED(fixed_h), event_box, 517, 169); gtk_container_add(GTK_CONTAINER(event_box), image_button); gtk_widget_add_events(GTK_WIDGET(event_box), GDK_BUTTON_PRESS_MASK); g_signal_connect(GTK_WIDGET(event_box),"button_press_event",G_CALLBACK(button_pressed),NULL); /// ************* ProgressBar ***************************** progressbar1= gtk_progress_bar_new (); gtk_fixed_put(GTK_FIXED(fixed_h), progressbar1, 515, 319); gtk_widget_set_size_request(progressbar1, 85, 6); gtk_progress_bar_set_bar_style(progressbar1,GTK_PROGRESS_CONTINUOUS); ///**************** Signale ******************************** gtk_signal_connect((window), "expose_event", G_CALLBACK(anzeige_basis_expose),NULL); g_signal_connect(window, "expose-event", G_CALLBACK (create_clock_ticks), NULL); gtk_signal_connect((window), "expose_event", G_CALLBACK(zeiger_animation ),NULL); gtk_signal_connect((window), "expose_event", G_CALLBACK(anzeige_cover_expose),NULL); g_signal_connect((window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_set_app_paintable(window, TRUE); g_timeout_add(95, (GSourceFunc) time_handler, (gpointer) window); ///**************** public ******************************** gtk_widget_show_all(window); gtk_main(); cairo_surface_destroy(anzeige_basis); cairo_surface_destroy(anzeige_cover); return 0; }
MikroMakro
-
Bin in meiner Recherche ein Stueck weitergekommen.
Ich hatte bei der Entwicklung irgendwann das DosFenster abgeschalten.
Das habe ich wieder eingeschalten.
Das stand da nun die Warnung:GdkPixbuf-Warning **:cannot open pixbuf loader module file + Pfad zum Projectordner + etc/gtk-2.0/gdk-pixbuf.loaders
Ich habe den Ordner "etc" in meinen ProjectOrdner kopiert.
App gestartet.
Die Warnung "GdkPixbuf-Warning...." blieb aus.
Das Bild wurde aber dennoch nicht geladen.Ich habe dazu noch etwas gegoogelt. Aber nur Bruchstuecke gefunden, welche ich mir nicht zusammenfuegen kann.
Hat da jemand noch ein Hinweis?
-
So nun scheint es zu funktionieren.
Nachdem ich das Project neu erstellt hatte blieb das Problem weiterhin bestehen.
Nachdem ich das Project mit einem aktuellerem GTK-Package compilierte "schwoll" die .exe von 352kB auf 438kB an.
Nun läuft die App auf beiden Rechnern.Das vorhergehende GTK Package war das 2.16.
Das aktuell neu installierte das 2.22.Aber ich kann mir auch nicht vorstellen, dass es an der Version des Packages lag.
Das sind ja Standard-Module mit denen ich arbeite.
Evtl wurde mal etwas "verinstalliert"Danke &Gruß