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

Reply via email to