OpenGL + gtkglextmm +林间空地 [英] OpenGL + gtkglextmm + glade

查看:150
本文介绍了OpenGL + gtkglextmm +林间空地的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我使用"gtkmm"进行编程时,有一个小部件"Gtk :: DrawingArea" .
我可以对小部件手工" (这样写代码)进行编程,或者更优雅的方法是使用"glade"用户界面设计器,在这里我可以用图形方式进行相同的 .

when I am programming with "gtkmm", there is a widget "Gtk::DrawingArea".
I can program that widget "by hand" (so write the code) or more elegant way is to use "glade" user interface designer, where I can do the same "graphically".

现在,我正在尝试通过"gtkglextmm"库将OpenGL与gtkmm连接.在该库中,有一个小部件"Gtk :: GL :: DrawingArea" -但是此小部件不是" 在林间空地中可用.

Now I am trying to connect OpenGL with gtkmm through "gtkglextmm" library. In that library, there is a widget "Gtk::GL::DrawingArea" - but this widget "IS NOT" available in glade.

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

So is there any way to program with "OpenGL + gtkglextmm" using "glade" (for the "graphical user interface" part)?

谢谢.

推荐答案

首先libglade是一个旧库.如果您要编写新项目,请从 gtk构建器开始.

First of all libglade is an old library. If you are writing new project start with gtk builder.

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

As you can see here gtkmm provide easy way to create your own widgets and see them (almost) in glade tool. You simply insert plain DrawinArea widget to window and then tell gtk-builder to put in this place yours derived class.

这是在一起:

设置gtk-builder:

Setting up gtk-builder:

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

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

Opengl DrawingArea类:

Opengl DrawingArea class:

 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绘图区域:

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

这篇关于OpenGL + gtkglextmm +林间空地的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆