gtkmm: maus-position feststellen
-
Hi!
Ich denke mal die Frage steht schon im Titel!
Ich möchte mir ein Fenster mit gtkmm erstellen und immer wenn ich mit der Maus auf eine Position im Fenster klicke, dann sollen mir die x und y Koordinaten angezeigt werden. Das Fenster zu erstellen ist dabei kein Problem. Ich habe aber noch Probleme mit der Mausprogrammierung. Wäre nett wenn mir da jemand helfen könnte.
Gruß!
shorty_76
-
Zuerst schreibst du folgende Methode für dein Gtk::Window:
bool on_button_press_event(GdkEventButton* event);Über den Parameter kriegst du dann die Infos raus, siehe hier: http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html#GdkEventButton
MfG
GPC
-
Vielen Dank für die schnelle Antwort. Ich probiere das gleich mal aus.
edit: hat geklappt. Ich kann mir die koordinaten anzeigen lassen. Vielen Dank nochmal für deine Hilfe.
-
Sorry das ich mich noch einmal melde. Aber ich versteh das nicht. Ich wollte jetzt auf verschiedene Mausklicks anders reagieren. Also zum Beispiel auf Einzel- oder Doppelklick. Uns so wie ich das sehe kann ich das über den GdkEventType machen.
Bloß bei mir wird folgender fehler angezeigt: struct _GdkEventButton hat kein Element namens GdkEventType.Weisst du vielleicht voran das liegt?
-
shorty_76 schrieb:
Weisst du vielleicht voran das liegt?
Na ja, du machst was falsch. Und ich kann mir auch denken was.
Allerdings hilft mir der Quellcode beim Denken
-
ich habe jetzt gerade probiert einen einfachen quellcode zu schreiben. dieser sieht folgendermaßen aus!
MainWindow.h:
#ifndef MAINWINDOW_H_ #define MAINWINDOW_H_ #import <gtkmm.h> class MainWindow : Gtk::Window { public: MainWindow(); ~MainWindow(); bool on_button_press_event(GdkEventButton * event); }; #endif
MainWindow.cpp:
#include "MainWindow.h" #include <iostream> MainWindow::MainWindow() { set_default_size(800, 600); set_title("MainWindow"); } MainWindow::~MainWindow() { } bool MainWindow::on_button_press_event(GdkEventButton * event) { if(event->GdkEventType == GDK_BUTTON_PRESS) { std::cout << "klick" << std::endl; std::cout << event->x << " " << event->y << std::endl; } else if(event->GdkEventType == GDK_2BUTTON_PRESS) { std::cout << "double-klick" << std::endl; std::cout << event->x << " " << event->y << std::endl; } }
leider funktioniert das jetzt auch schon nicht mehr. ich dachte ich hätte es verstanden,weil in meiner eigentlichen anwendung funktioniert es. aber das ist richtig viel code und den wollte ich nicht posten. aber wenn du ihn brauchst dann poste ich ihn auch noch.
edit: das mit der else/if schleife klappt bei meinem eigentlichen programm auch nicht. ich habe den code jetzt nur so geschrieben wie ich gedacht habe das es funzt.
-
Mach mal aus dem #import <gtkmm.h> ein #include <gtkmm.h>
Das if-else Konstrukt (es gibt keine if-Schleifen!) sieht richtig aus.
Falls weitere Fehlermeldungen kommen, bitte auch posten.
-
sorry, natürlich steht da im code #include und nicht #import. aber wenn ich auf das fenster klicke kommt keine ausgabe. wenn ich die if/else-anweisung drin lasse dann kommt halt der fehler das das struct kein GdkEventType kennt. Ich weiß da nicht weiter! Und wieso wird mir jetzt keine ausgabe gezeigt wenn ich in methode nur:
std::cout << "klick" << std::endl;
std::cout << event->x << " " << event->y << std::endl;drin stehen habe?
-
Hm, man sollte keine Fragen beantworten, wenn man gedanklich schon im Feierabend ist. Ich schau's mir noch mal genauer an
-
So, erstmal folgender Code:
#include <iostream> #include <gtkmm.h> //WICHTIG: public ableiten!! class MainWindow : public Gtk::Window { protected: bool on_button_press_event(GdkEventButton *); public: MainWindow(); ~MainWindow(); }; MainWindow::MainWindow() { set_default_size(800, 600); set_title("MainWindow"); show_all_children(); //Das fehlte dir } MainWindow::~MainWindow() { } bool MainWindow::on_button_press_event(GdkEventButton *event) { bool return_value = Window::on_button_press_event(event); if( (event->type == GDK_BUTTON_PRESS) && (event->button == 1) ) { std::cout << "klick" << std::endl; std::cout << event->x << " " << event->y << std::endl; } else if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 2) ) { std::cout << "double-klick" << std::endl; std::cout << event->x << " " << event->y << std::endl; } /* WICHTIG: Das return signalisiert, ob das Event hier erfolgreich behandelt wurde. Gib false zurück, wenn das nicht der Fall ist und true, wenn das passt. Wird hier aber automatisch geregelt. */ return return_value; } int main(int argc, char **argv) { Gtk::Main m(argc, argv); MainWindow w; m.run(w); }
Er kompiliert schön, funktioniert aber nicht. Und zwar weil das Event nicht an unsere Methode weitergereicht wird (jedes Gtk::Window hat automatisch eine Gtk::VBox, die sozusagen unser Event blockiert).
Der ganze Kram muss eine Ebene tiefer geschehen. D.h. du machst das direkt auf deiner eigenen Gtk::VBox, Gtk::HBox, Gtk::Table oder was weiß ich.Das letzte Beispiel auf dieser Seite demonstriert das sehr schön: http://gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch08s08.html
-
erstmal möchte ich dir danken das du so viel geduld mit mir hast!
ich werde das im laufe des vormittags heute mal ausprobieren und dann mein ergebnis hier posten.
@GPC hast mein vollen respekt für so viel geduld
edit: also ich habe es jetzt zum laufen gebracht. es geht wenn ich meine klasse von TreeView ableite. aber warum geht es nicht wenn ich von Image ableite. geht das nicht mit allen?