2012-02-15 2 views
3

GTK와 OpenGL을 사용하여 C++ 어플리케이션을 작성하고 있습니다. XML 파일을 읽고 자체 빌드하는 GTK 빌더가 있습니다. OpenGL 창 영역을 추가해야합니다. 어떻게해야합니까?GTK 빌더에 OpenGL 윈도우 추가하기

+2

도움이된다면 답변을 수락하고 upvote하는 것을 잊지 마십시오. – kalev

답변

12
은 (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 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 사용 가능 드로잉 영역을 만들고 빈 컨테이너에 추가합니다. 일반적으로 GtkGL DrawingArea를 "load-time"으로 대체 할 수는 있지만 (this posting 참조), 그 방법은 나에게 적합하지 않습니다. 위의, 그것을 프로그래밍 방식으로 생성, 항상 않았다.

GL Drawingarea 위젯에는 gtkglext/gtkglextmm이 필요합니다.

관련 문제