OpenGL + gtkglextmm + グレード
質問
「gtkmm」でプログラミングをしていると、ウィジェットがあります 「Gtk::DrawingArea」.
そのウィジェットをプログラムできます "手で" (コードを書きます) または、より洗練された方法は、「glade」ユーザー インターフェイス デザイナーを使用することです。そこでも同じことができます。 「グラフィック的に」.
現在、「gtkglextmm」ライブラリを介してOpenGLをgtkmmに接続しようとしています。そのライブラリにはウィジェットがあります 「Gtk::GL::DrawingArea」 - しかし、このウィジェット "ではありません" 空き地で利用可能。
それでは、「glade」(「グラフィカルユーザーインターフェイス」部分)を使用して「OpenGL + gtkglextmm」でプログラミングする方法はありますか?
ありがとう。
解決
まず、libglade は古いライブラリです。新しいプロジェクトを作成している場合は、次から始めます gtkビルダー.
ご覧のように ここ 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;
};
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);
}
所属していません StackOverflow