将一个OpenGL窗口添加到GTK构建器中 [英] Adding an OpenGL window into a GTK builder

查看:337
本文介绍了将一个OpenGL窗口添加到GTK构建器中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用GTK和OpenGL编写了一个C ++应用程序。我有一个GTK构建器读取一个XML文件并构建自己。我需要添加一个OpenGL窗口区域。

I am writing a C++ application using GTK and OpenGL. I have a GTK builder which reads an XML file and builds itself. I need to add an "OpenGL window area" into it. How do I do this?

推荐答案

我这样做(gtkmm / C ++代码)是这样的:

The way I do it (gtkmm / C++ code) is like this:

#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 config\n");
        return -1;
    }

    GLWidget drawingArea(glconfig);

    drawingArea.set_size_request(640, 480);
    drawingArea.show();
    container->add(drawingArea);

    kit.run(*mainWindow);

    return 0;

我只是加载一个UI,其中包含一个空的容器窗口小部件,获得该名称的句柄,然后在代码中创建启用GL的绘图区域,并将其添加到空容器。据推测,可以用加载时间替换普通的Gtk DrawingArea用于GtkGL(参见此发布)但是这种方法对我没有工作;

I.e. I'm simply loading a UI that contains an empty container widget, get the handle to that by name, then create the GL-enabled drawing area in code and add it to the empty container. Supposedly, it's possible to "load-time" substitute an ordinary Gtk DrawingArea for a GtkGL one (see this posting) but that method didn't work for me; the above, programmatically creating it, always did.

您需要gtkglext / gtkglextmm用于GL Drawingarea小部件。

You need gtkglext / gtkglextmm for the GL Drawingarea widget.

这篇关于将一个OpenGL窗口添加到GTK构建器中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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