2

「gtkmm」でプログラミングしていると、ウィジェット「Gtk::DrawingArea」があります。
そのウィジェットを「手動で」プログラムすることができます(つまり、コードを記述します)。または、よりエレガントな方法は、同じ「グラフィック」を実行できる「glade」ユーザーインターフェイスデザイナーを使用することです。

今、私は「gtkglextmm」ライブラリを介してOpenGLをgtkmmに接続しようとしています。そのライブラリには、ウィジェット「Gtk :: GL :: DrawingArea」がありますが、このウィジェットは ISNOT」で空き地にあります。

では、「glade」(「グラフィカルユーザーインターフェイス」の部分)を使用して「OpenGL + gtkglextmm」でプログラミングする方法はありますか?

ありがとう。

4

1 に答える 1

6

まず第一に、libgladeは古いライブラリです。新しいプロジェクトを作成している場合は、gtkbuilderから始めてください。

あなたがここで見ることができるように、gtkmmはあなた自身のウィジェットを作成してそれらを(ほとんど)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;
 };

opengldrawingareaの構築:

// 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);
}
于 2009-12-15T00:41:12.850 に答える