Frage

, wenn ich mit "gtkmm" bin Programmierung gibt es ein Widget "Gtk :: DrawingArea" .
Ich kann dieses Widget programmieren „von Hand“ (so den Code schreiben) oder elegantere Weg ist „Lichtung“ User Interface Designer zu verwenden, wo ich die gleiche „grafisch“ .

Jetzt versuche ich, OpenGL mit gtkmm durch „gtkglextmm“ Bibliothek zu verbinden. In dieser Bibliothek gibt es einen Widget "Gtk :: GL :: DrawingArea" - aber das Widget "nicht" in Glade

.

So ist es eine Möglichkeit, Programm mit „OpenGL + gtkglextmm“ mit „Lichtung“ (für die „grafische Benutzeroberfläche“ -Teil)?

Danke.

War es hilfreich?

Lösung

Vor allem libglade ist eine alte Bibliothek. Wenn Sie neuen Projektstart schreiben mit gtk builder .

Wie Sie sehen können hier gtkmm bietet eine einfache Möglichkeit, Ihre eigenen Widgets zu erstellen und sie (fast) in Lichtung Werkzeug zu sehen. Sie einfach einfügen Ebene DrawinArea Widget Fenster und dann tell gtk-Builder an dieser Stelle bei Ihnen abgeleiteten Klasse setzen.

Hier ist alles zusammen:

Einrichten von gtk-Builder:

refBuilder = Gtk::Builder::create_from_file(ui_file);

GlDrawingArea*glArea = NULL;
refBuilder->get_widget_derived("drawing_gl",glArea);

Opengl DrawingArea Klasse:

 class GlDrawingArea : public Gtk::DrawingArea ,
                       public Gtk::GL::Widget<GlDrawingArea>
 {                   
 public:             
         GlDrawingArea(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
         virtual ~GlDrawingArea();
 protected:          
         void on_realize();
         bool on_expose_event(GdkEventExpose* event);
         bool on_configure_event(GdkEventConfigure* event);          
 private:
         Glib::RefPtr<Gtk::Builder> refBuilder;
 };

Constructing opengl drawingarea:

// GlDrawingArea:
GlDrawingArea::GlDrawingArea(BaseObjectType*cobject, const Glib::RefPtr<Gtk::Builder>& builder)
        : Gtk::DrawingArea(cobject),
          refBuilder(builder),
          screen_tex(0)
{                                                                                               
        //
        // Configure OpenGL-capable visual.
        //
        Glib::RefPtr<Gdk::GL::Config> glconfig;

        // Try double-buffered visual
        glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB    |
                                           Gdk::GL::MODE_DEPTH  |
                                           Gdk::GL::MODE_DOUBLE);
        if (!glconfig) {
                std::cerr << "*** Cannot find the double-buffered visual.\n"
                          << "*** Trying single-buffered visual.\n";

                // Try single-buffered visual
                glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB |Gdk::GL::MODE_DEPTH);
                if (!glconfig) {
                        std::cerr << "*** Cannot find any OpenGL-capable visual.\n";
                        std::exit(1);
                }
        }

        // print frame buffer attributes.
        GLConfigUtil::examine_gl_attrib(glconfig);

        //
        // Set OpenGL-capability to the widget.
        //
        set_gl_capability(glconfig);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top