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




Anmelden zum Antworten