将OpenGL窗口添加到GTK生成器中

Adding an OpenGL window into a GTK builder

本文关键字:GTK OpenGL 窗口 添加      更新时间:2023-10-16

我正在使用GTK和OpenGL编写C++应用程序。我有一个GTK构建器,它读取一个XML文件并构建自己。我需要在其中添加一个"OpenGL窗口区域"。我该怎么做?

我做这件事的方式(gtkmm/C++代码)是这样的:

#include <gtkmm.h>
#include <gtkglmm.h>
class GLWidget : public Gtk::GL::DrawingArea {
    public:
    GLWidget(Glib::RefPtr<Gdk::GL::Config> glconfig)
        : Gtk::GL::DrawingArea(glconfig) {}
    ~GLWidget() {}
    virtual bool on_expose_event(GdkEventExpose* event);
};
bool GLWidget::on_expose_event(GdkEventExpose* event)
{
    Glib::RefPtr<Gdk::GL::Drawable> d = get_gl_drawable();
    d->gl_begin(get_gl_context());
    // make this as complex as you need
    glClear(GL_COLOR_BUFFER_BIT);
    d->swap_buffers();
    d->gl_end();
    return true;
}
int main(int argc, char **argv)
{
    Gtk::Main kit(argc, argv);
    Gtk::GL::init(argc, argv);
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("ui.glade");
    Gtk::Window* mainWindow;
    Gtk::Alignment* container;
    builder->get_widget("mainWindow", mainWindow);
    builder->get_widget("Box", container);
    if (mainWindow == NULL || container == NULL) {
        g_critical("Gtk Builder failed to load mainWindow and/or container !n");
        return -1;
    }
    Glib::RefPtr<Gdk::GL::Config> glconfig;
    glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGBA | Gdk::GL::MODE_DOUBLE);
    if (!glconfig)
        glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB);
    if (!glconfig) {
        g_critical("Cannot create OpenGL-capable confign");
        return -1;
    }
    GLWidget drawingArea(glconfig);
    drawingArea.set_size_request(640, 480);
    drawingArea.show();
    container->add(drawingArea);
    kit.run(*mainWindow);
    return 0;

也就是说,我只是加载一个包含容器小部件的UI,按名称获取该小部件的句柄,然后在代码中创建启用GL的绘图区域,并将其添加到空容器中。据推测,用普通的GtkDrawingArea代替GtkGL是可能的(见本文),但这种方法对我不起作用;上面的内容,通过编程方式创建它,一直都是这样。

GL Drawingarea小部件需要gtkglext/gtkglextmm。