2016-02-26 3 views
1

Я пытаюсь создать простое приложение с gtkmm, но у меня есть некоторые проблемы.Сбой приложения Gtkmm, когда объект окна разыменования

Вот как это выглядит сейчас:

enter image description here

Вот код для его генерации:


MyWindow.h:

#ifndef MYWINDOW_H_ 
#define MYWINDOW_H_ 
#include <gtkmm/window.h> 
#include <gtkmm/frame.h> 
#include "MyDrawingArea.h" 

class MyWindow :public Gtk::Window { 
public: 
    MyWindow(); 
    virtual ~MyWindow() {} 

private: 
    MyDrawingArea drawing_area; 
}; 

#endif /* MYWINDOW_H_ */ 

MyWindow.cpp:

#include "MyWindow.h" 

MyWindow::MyWindow() : drawing_area("Drawing area") { 
    set_title("My app"); 
    set_border_width(10); 
    add(drawing_area); 
    drawing_area.draw_stuff_in_area(); 


    show_all_children(); 
} 

MyDrawingArea.h:

#ifndef MYDRAWINGAREA_H_ 
#define MYDRAWINGAREA_H_ 
#include <gtkmm/frame.h> 
#include <gtkmm/drawingarea.h> 

class MyDrawingArea : public Gtk::Frame { 
public: 
    MyDrawingArea(const Glib::ustring& title); 
    virtual ~MyDrawingArea() {} 
    void draw_stuff_in_area(); 

private: 
    Gtk::DrawingArea area; 
}; 

#endif /* MYDRAWINGAREA_H_ */ 

MyDrawingArea.cpp:

#include "MyDrawingArea.h" 
#include <iostream> 
#include <gtkmm/window.h> 

MyDrawingArea::MyDrawingArea(const Glib::ustring& title) : Gtk::Frame(title) { 

    set_border_width(20); 
    add(area); 

    area.set_size_request(300, 250); 
} 

void MyDrawingArea::draw_stuff_in_area() { 

    Cairo::RefPtr<Cairo::Context> cr = area.get_window()->create_cairo_context(); // program crashes here! 
    // draw stuff with 'cr' here... 

} 

Как комментарий говорит, программа вылетает, когда я пытаюсь создать Cairo::Context, хотя я не думаю, что проблема заключается в создании Cairo::Context: Every dereferenci ng к объекту, возвращаемому my_area.get_window(), сбой программы!

Кто-нибудь знает, что вызывает проблему?

+0

Независимо от нулевого указателя, это не способ рисования на области рисования; вместо этого подключитесь к сигналу рисования области рисования и выполните рисунок в обработчике сигнала. Обработчик сигнала получит переданный ему «Cairo :: Context», поэтому вам не нужно его создавать. – ptomato

+0

Но что, если я хочу начать рисовать, а не ждать сигнала? –

+0

Итак, вы просто ничего не рисуете в своем on_draw(), пока не захотите. У вас нет реального контроля над вызовом on_draw(), но вы решаете, что делать, когда он вызывается. Кстати, здесь есть много примеров: https://developer.gnome.org/gtkmm-tutorial/stable/chapter-drawingarea.html.en. Но вам может быть удобнее использовать GooCanvas, который позволяет вам накладывать фигуры на холст, которые затем нарисованы для вас. – murrayc

ответ

1

Привет вы проверить возвращаемое значение area.get_window(), потому что documentation говорит

Возвращает окно виджета, если он реализуется, 0 в противном случае.

 Смежные вопросы

  • Нет связанных вопросов^_^