Skalierendes Bild?
-
Hallo,
Ich habe mal wieder ein kleines Problem mit gtkmm:
Angenommen ich will ein Bild darstellen, das auch größer / kleiner wird, wenn das Fenster größer / kleiner wird. Skalieren klappt mit Pixbuf::scale_simple super, das Bild kann ich mit Gtk::Image::set(...) auch anzeigen. Aber das Problem ist die Größe: Wenn das Bild eine bestimmte Größe hat, kann ich das Fenster nicht mehr verkleinern. Um es kurz und knapp zu demonstrieren habe ich ein kleines Beispiel-Programm (und sorry schonmal für den Stil... ist ja nur zum zeigen ;)):#include <gtkmm.h> #include <string> #include <iostream> using namespace std; class Test : public Gtk::Window { public: Test(); void clicked(); protected: void on_size_allocate(Gtk::Allocation&); private: Glib::RefPtr<Gdk::Pixbuf> buf_unscaled; Glib::RefPtr<Gdk::Pixbuf> buf_scaled; Gtk::Image image; Gtk::VBox box; Gtk::Frame frame_img; Gtk::Button scale; }; void Test::on_size_allocate(Gtk::Allocation& a) { Widget::on_size_allocate(a); /* Diese Methode wird, wenn ich richtig informiert bin, aufgerufen, wenn das Fenster vergrößert / verkleinert wird. Jetzt hier einfach den selben Code der Methode clicked reinzukopieren funktioniert eben nicht! Funktioniert nicht bedeutet soviel wie: Fenster bleibt grau, Programm 'hängt'*/ } Test::Test() { scale.set_label("Scale image!"); buf_unscaled = Gdk::Pixbuf::create_from_file("index.jpeg"); buf_scaled = buf_unscaled->scale_simple(400, 300, Gdk::INTERP_BILINEAR); image.set(buf_scaled); frame_img.set_label("Image"); frame_img.add(image); box.pack_start(frame_img); box.pack_end(scale, false, true, 0); add(box); show_all_children(); scale.signal_clicked().connect(sigc::mem_fun(*this, &Test::clicked)); } void Test::clicked() { buf_scaled.reset(); // Ist diese Zeile überhaupt notwendig??? buf_scaled = buf_unscaled->scale_simple(frame_img.get_width() - 5, frame_img.get_height()- 20, Gdk::INTERP_BILINEAR); //Kann man die Zahlen 5 //und 20 nicht 'besser' bestimmen als durch ausprobieren? image.set(buf_scaled); } int main(int argc, char* argv[]) { Gtk::Main main(argc, argv); Test window; main.run(window); return 0; }
Wie kann ich dieses Problem lösen. Ich schätze es ist ziemlich einfach, aber ich kenn eben nicht alle gtkmm-Feinheiten :(.
Danke schonmal!nobody44
-
Problem gelöst mit:
http://old.nabble.com/Rescaling-Gtk::Image-td18083941.html