The purpose of my code is just showing the error. I was wonering about the reason why its failed. Is the error related to the expose event? And Is there any ways to create a context that i can use it many times?But currently When i want to draw something every time , i shoud create it again.
2008/12/3 Milosz Derezynski <[EMAIL PROTECTED]> > Hey Diego, > > The thing with this is that I don't think it makes any sense. > > Just keeping an old Cairo::Context arouind is not really useful, Context > creation is very cheap > and I think there might be implications regarding Widget double-buffering > for keeping a Context around, > (but someone else would have to make a definitive statement about that, I'm > not 100% sure right now). > > As for keeping another surface around: to show something on the Widget's > window > you need to draw on that, and not on another surface. If you do in fact > draw on another surface then, yes, you will > have to copy that over the actual Widget's surface every time in expose, > which can be indeed useful if your > drawings are very complex and expensive to redraw, but is generally not > recommended if you can instead keep a state > in your app so that in expose, the drawing can be redrawn based on the > state. > > The initial code sent here by BC, again, doesn't make really any sense at > all (no offense). It just added an extra step > of getting the surface associated with the Widget's window, and then > getting a context for that surface again, which is > equivalent to just getting the context with window->create_cairo_context(); > > > M. > > > On Wed, Dec 3, 2008 at 12:49 PM, Diego A. Fons <[EMAIL PROTECTED]>wrote: > >> Milosz Derezynski wrote: >> >>> It does not seem neccessary to create 2 separate Cairo Contexts: >>> >>> class MyArea : public Gtk::DrawingArea >>> { >>> public: >>> virtual ~MyArea(); >>> protected: >>> //Override default signal handler: >>> virtual bool on_expose_event( >>> >>> GdkEventExpose* event); >>> }; >>> MyArea::MyArea() >>> { >>> } >>> MyArea::~MyArea() >>> { >>> } >>> bool MyArea::on_expose_event(GdkEventExpose* event) >>> { >>> // This is where we draw on the window >>> Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); >>> cr->set_line_width(10.0); >>> cr->move_to(0, 0); >>> cr->line_to(100, 100); >>> cr->stroke(); return true; >>> } >>> >>> >>> This will work equally well. Is there any specific reason why you want to >>> keep the surface member in the class and use it the way you wrote it in the >>> preceding mail? >>> >>> M. >>> >>> >>> 2008/12/3 BC Zhu <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> >>> >>> >>> Now i am using Gtkmm. I want to maintain a reference to >>> Cairo::Context or Cairo::Surface, so i can draw something on it >>> anywhere. >>> I am trying to do this , but failed. >>> With following code , i am trying to keep a reference to >>> Cairo:::Surface,but when on_expose_event was called secondly , it >>> will fail. >>> And i have tried to maintain a reference to Cairo::Context too, >>> but failed either. >>> Could some body give me an advice? >>> Thanks in advance! >>> >>> >>> class MyArea : public Gtk::DrawingArea >>> { >>> public: >>> virtual ~MyArea(); >>> protected: >>> //Override default signal handler: >>> virtual bool on_expose_event(GdkEventExpose* event); >>> private: >>> Cairo::RefPtr<Cairo::Surface> surf_; >>> }; >>> MyArea::MyArea() >>> { >>> } >>> MyArea::~MyArea() >>> { >>> } >>> bool MyArea::on_expose_event(GdkEventExpose* event) >>> { >>> // This is where we draw on the window >>> if(!surf_){ >>> Glib::RefPtr<Gdk::Window> window = get_window(); >>> Cairo::RefPtr<Cairo::Context> cr = >>> window->create_cairo_context(); >>> surf_ = cr->get_target(); >>> } >>> Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surf_); >>> cr->set_line_width(10.0); >>> cr->move_to(0, 0); >>> cr->line_to(100, 100); >>> cr->stroke(); return true; >>> } >>> >>> >>> -- Best Regards >>> Bicen.Zhu >>> >>> _______________________________________________ >>> gtkmm-list mailing list >>> gtkmm-list@gnome.org <mailto:gtkmm-list@gnome.org> >>> http://mail.gnome.org/mailman/listinfo/gtkmm-list >>> >>> >>> >>> >>> -- >>> Please note that according to the German law on data retention, >>> information on every electronic information exchange with me is >>> retained for a period of six months. >>> [Bitte beachten Sie, dass dem Gesetz zur Vorratsdatenspeicherung zufolge >>> jeder elektronische Kontakt mit mir sechs Monate lang gespeichert wird.] >>> ------------------------------------------------------------------------ >>> >>> _______________________________________________ >>> gtkmm-list mailing list >>> gtkmm-list@gnome.org >>> http://mail.gnome.org/mailman/listinfo/gtkmm-list >>> >>> >> Hi, >> >> I also have this problem, my reason to keep the context (or surface) is >> that i want to draw and i don't want to loose the previous drawings i made >> in the context. >> >> The last code works fine but when you call >> Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); >> in the on_expose_event(), you are creating a new context, an empty >> context. >> >> My solution was drawing in a context i create and then copy this context >> over the one i get from the component, the problem is that this method is >> _very_ inefficient. >> >> Regards, >> Diego A. Fons. >> > > > > -- > Please note that according to the German law on data retention, > information on every electronic information exchange with me is > retained for a period of six months. > [Bitte beachten Sie, dass dem Gesetz zur Vorratsdatenspeicherung zufolge > jeder elektronische Kontakt mit mir sechs Monate lang gespeichert wird.] > > _______________________________________________ > gtkmm-list mailing list > gtkmm-list@gnome.org > http://mail.gnome.org/mailman/listinfo/gtkmm-list > > -- Best Regards Bicen.Zhu
_______________________________________________ gtkmm-list mailing list gtkmm-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtkmm-list