【问题标题】:OpenGL + gtkglextmm + gladeOpenGL + gtkglextmm + 林间空地
【发布时间】:2009-12-15 00:24:06
【问题描述】:

当我用“gtkmm”编程时,有一个小部件“Gtk::DrawingArea”
我可以“手动”编写该小部件(所以编写代码)或更优雅的方式是使用“glade”用户界面设计器,我可以在其中“以图形方式”进行相同操作 em>。

现在我正在尝试通过“gtkglextmm”库将 OpenGL 与 gtkmm 连接起来。在那个库中,有一个小部件 "Gtk::GL::DrawingArea" - 但是这个小部件 "IS NOT" 在林间空地中可用。

那么有什么方法可以使用“glade”(用于“图形用户界面”部分)使用“OpenGL + gtkglextmm”进行编程?

谢谢。

【问题讨论】:

    标签: opengl glade gtkmm


    【解决方案1】:

    首先,libglade 是一个古老的库。如果您正在编写新项目,请从 gtk builder 开始。

    如您所见,heregtkmm 提供了一种简单的方法来创建您自己的小部件并(几乎)在 glade 工具中查看它们。您只需将普通的 DrawinArea 小部件插入到窗口中,然后告诉 gtk-builder 将您的派生类放入此位置。

    大家一起来看看:

    设置 gtk-builder:

    refBuilder = Gtk::Builder::create_from_file(ui_file);
    
    GlDrawingArea*glArea = NULL;
    refBuilder->get_widget_derived("drawing_gl",glArea);
    

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

    构建opengl绘图区:

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

    【讨论】:

    • 非常感谢“qba”。所以关键在于使用“派生”小部件。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多