Maus position ermitteln bei clicked auf GtKImage



  • Hi,

    wie kann ich bei dem signal "clicked" (kann auch jedes andere signal sein) in GtK+ die Mausposition, zum Beispiel auf einem GtK Image (Muss wahrscheinlich eine EventBox drumherum,bin mir aber nicht sicher) ermitteln? Hat jemand eine Idee?

    Gruß



  • Hi,

    du musst das GdkEventButton Signal abfangen. http://library.gnome.org/devel/gdk/unstable/gdk-Event-Structures.html#GdkEventButton

    In den Membern x und y findest du dann die Koordinaten der Maus.

    Cheers

    GPC



  • klappt, vielen Dank.



  • OK, klappt doch nur partiell.

    Ich muß eine gtk_event_box um das Bild zaubern damit ich auch wirklich das event "button_press_event" abfangen kann. Wenn ich es um das gtk_image bastel dann klappts leider nicht. Habe auch schon probiert mittel gtk_widget_add_event das GDK_EVENT_BUTTON_MASK (oder so ähnlich) mein Ziel zu erreichen, klappt leider auch nicht.

    Ideen?

    Gruß



  • Kannst du etwas Beispiel-Code posten?



  • klaro

    static void image_pressed(GtkWidget *widget, GdkEventbutton *event, gpointer data)
    {
      std::cout << "Test" << std::endl;
    }
    
    ...
    
    GtkWidget *image_button = gtk_image_new_from_file( "testimg.jpg" );
    
    gtk_widget_add_events(GTK_WIDGET(image_button), GDK_BUTTON_PRESS_MASK);
    g_signal_connect(GTK_WIDGET(image_button), "button_press_event",
                     G_CALLBACK(image_pressed), NULL);
    
    ...
    

    Wie gesagt, hatte ich es erst mit einer EventBox versucht,klappte auch, allerdings ist die eventbox größer als das Bild, wenn man also die größe des Programmfenster ändert könnte ich die ganze positionierung wegwerfen.

    Gruß



  • Bin selbst drauf gekommen, allerdings ergibt sich daraus ein weiteres problem.

    Ich hab das padding und alignment des bildes auf 0 gesetzt, somit ist das bild jetzt bündig mit der event box.

    Das sieht allerdings ziemlich mies aus, da das image links oben in einem GTK Frame sitzt.

    Kann ich die event_box evtl. irgendwie verkleinern so das das bild mittig von dem Frame ist und die koordinaten von der event_box gleich der des bildes sind?

    Die Event Box ist auch immernoch größer als das Bild, das ist nicht weiter schlimm, aber auch nicht gerade sehr sauber.



  • poe schrieb:

    Bin selbst drauf gekommen, allerdings ergibt sich daraus ein weiteres problem.

    Ich hab das padding und alignment des bildes auf 0 gesetzt, somit ist das bild jetzt bündig mit der event box.

    Das sieht allerdings ziemlich mies aus, da das image links oben in einem GTK Frame sitzt.

    Kann ich die event_box evtl. irgendwie verkleinern so das das bild mittig von dem Frame ist und die koordinaten von der event_box gleich der des bildes sind?

    Klar, dazu musst du nur noch ein GtkAlignment vor die EventBox in dein Frame packen. Um zu zentrieren müssen xalign und yalign auf 0.5 gesetzt werden.

    Die Event Box ist auch immernoch größer als das Bild, das ist nicht weiter schlimm, aber auch nicht gerade sehr sauber.

    Wenn du beim GtkAlignment xscale und yscale auf 0 stellst, nicht mehr 🙂

    Hier mal Beispiel-Code:

    #include <gtk/gtk.h>
    #include <stdio.h>
    
    static void image_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data)
    {
        printf("x: %lf y: %lf\n", event->x, event->y);
    }
    
    static void destroy(GtkWidget *widget, gpointer data)
    {
        gtk_main_quit();
    }
    
    int main(int argc, char *argv[])
    {
        GtkWidget *window;
    
        gtk_init(&argc, &argv);
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
        g_signal_connect(G_OBJECT(window), "destroy",
                  G_CALLBACK(destroy), NULL);
    
        GtkWidget *image = gtk_image_new_from_file("bild.jpg");
    
        gtk_misc_set_padding(GTK_MISC(image), 0, 0);
        gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
    
        GtkWidget *event_box = gtk_event_box_new();
        gtk_widget_add_events(GTK_WIDGET(event_box), GDK_BUTTON_PRESS_MASK);
        g_signal_connect(GTK_WIDGET(event_box), "button_press_event",
                         G_CALLBACK(image_pressed), NULL);
        gtk_container_add(GTK_CONTAINER(event_box), image);
    
        GtkWidget *frame = gtk_frame_new("test");
    
        GtkWidget *alignment = gtk_alignment_new(0.5f, 0.5f, 0.0f, 0.0f);
    
        gtk_container_add(GTK_CONTAINER(frame), alignment);
    
        gtk_container_add(GTK_CONTAINER(alignment), event_box);
    
        gtk_container_add(GTK_CONTAINER(window), frame);
    
        gtk_widget_show_all(window);
    
        gtk_widget_show (window);
    
        gtk_main ();
        return 0;
    }
    

Log in to reply