Hey BC,

What exactly fails? It doesn't draw or is it some other error? Please
clarify this. Thanks.

M.

2008/12/4 BC Zhu <[EMAIL PROTECTED]>

> 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
>



-- 
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

Reply via email to