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
>>>> [email protected] <mailto:[email protected]>
>>>> 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
>>>> [email protected]
>>>> 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
>> [email protected]
>> 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
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list