Я пытаюсь создать простое приложение с gtkmm
, но у меня есть некоторые проблемы.Сбой приложения Gtkmm, когда объект окна разыменования
Вот как это выглядит сейчас:
Вот код для его генерации:
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(), сбой программы!
Кто-нибудь знает, что вызывает проблему?
Независимо от нулевого указателя, это не способ рисования на области рисования; вместо этого подключитесь к сигналу рисования области рисования и выполните рисунок в обработчике сигнала. Обработчик сигнала получит переданный ему «Cairo :: Context», поэтому вам не нужно его создавать. – ptomato
Но что, если я хочу начать рисовать, а не ждать сигнала? –
Итак, вы просто ничего не рисуете в своем on_draw(), пока не захотите. У вас нет реального контроля над вызовом on_draw(), но вы решаете, что делать, когда он вызывается. Кстати, здесь есть много примеров: https://developer.gnome.org/gtkmm-tutorial/stable/chapter-drawingarea.html.en. Но вам может быть удобнее использовать GooCanvas, который позволяет вам накладывать фигуры на холст, которые затем нарисованы для вас. – murrayc