2009-12-15 6 views
2

Lorsque je programme avec "gtkmm", il y a un widget "Gtk :: DrawingArea".
Je peux programmer ce widget "à la main" (donc écrivez le code) ou plus élégante façon d'utiliser "glade" concepteur d'interface utilisateur, où je peux faire la même "graphiquement".OpenGL + gtkglextmm + glade

Maintenant, j'essaie de connecter OpenGL avec gtkmm à travers la bibliothèque "gtkglextmm". Dans cette bibliothèque, il y a un widget "Gtk :: GL :: DrawingArea" - mais ce widget "N'EST PAS" disponible en clairière.

Alors, est-il possible de programmer avec "OpenGL + gtkglextmm" en utilisant "glade" (pour la partie "interface utilisateur graphique")?

Merci.

Répondre

6

Tout d'abord, libglade est une ancienne bibliothèque. Si vous écrivez un nouveau projet, commencez par gtk builder.

Comme vous pouvez le voir here gtkmm fournir un moyen facile de créer vos propres widgets et de les voir (presque) dans l'outil glade. Vous insérez simplement le widget DrawinArea dans la fenêtre, puis dites à gtk-builder de mettre dans cette classe la vôtre dérivée.

Voici tous ensemble:

Mise en place gtk-constructeur:

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

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

Opengl classe DrawingArea:

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; 
}; 

Construction 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); 
} 
+0

Je vous remercie beaucoup "qba". Donc, la clé était d'utiliser des widgets "dérivés". – Petike