Scribble with rubber



Hi..
I have created a window that scribble on one image..
Now i want have the possibility of rubber that have scribbled..use spin
botton that escludes one by one..when i use the pen..i don't can use tha
rubber..and conversely
Someone have some code..idea..?
This is..my code..
there is also the event box..that capture the coord of the point that
scribble..
thanks in advance..
;)

#include <gtkmm.h>
#include <iostream>
#include <gdkmm/cursor.h>

class Example_DrawingArea : public Gtk::Window
{
public:
  Example_DrawingArea();
  virtual ~Example_DrawingArea();

protected:
//signal handlers:
  bool on_drawingarea_scribble_expose_event(GdkEventExpose* event);
  bool on_drawingarea_scribble_configure_event(GdkEventConfigure* event);
  bool on_drawingarea_scribble_motion_notify_event(GdkEventMotion* event);
  bool on_drawingarea_scribble_button_press_event(GdkEventButton* event);

  void scribble_draw_brush(int x, int y);

  //Member widgets:
  Gtk::Frame m_Frame_Scribble;
  Gtk::VBox m_VBox;
  Gtk::Label  m_Label_Scribble;
  Gtk::DrawingArea m_DrawingArea_Scribble;
  Glib::RefPtr<Gdk::Pixmap> m_refPixmap_Scribble;
};


Example_DrawingArea::Example_DrawingArea()
:
  m_VBox(false, 8)
{
  set_title("Drawing Area");
  set_border_width(8);

  m_VBox.set_border_width(8);
  add(m_VBox);

/*  Create the scribble area */

  m_Label_Scribble.set_markup("<u>Scribble area</u>");
  m_VBox.pack_start(m_Label_Scribble, Gtk::PACK_SHRINK);

  m_Frame_Scribble.set_shadow_type(Gtk::SHADOW_IN);
  m_VBox.pack_start(m_Frame_Scribble);

  /* set a minimum size */
  m_DrawingArea_Scribble.set_size_request(200, 200);
  m_Frame_Scribble.add(m_DrawingArea_Scribble);

  /* Signals used to handle backing pixmap */
 m_DrawingArea_Scribble.signal_expose_event().connect(
   sigc::mem_fun(*this,
&Example_DrawingArea::on_drawingarea_scribble_expose_event));
  m_DrawingArea_Scribble.signal_configure_event().connect(
      sigc::mem_fun(*this,
&Example_DrawingArea::on_drawingarea_scribble_configure_event));

  /* Event signals */
  m_DrawingArea_Scribble.signal_motion_notify_event().connect(
      sigc::mem_fun(*this,
&Example_DrawingArea::on_drawingarea_scribble_motion_notify_event));
  m_DrawingArea_Scribble.signal_button_press_event().connect(
      sigc::mem_fun(*this,
&Example_DrawingArea::on_drawingarea_scribble_button_press_event));

  m_DrawingArea_Scribble.add_events(Gdk::LEAVE_NOTIFY_MASK |
                                    Gdk::BUTTON_PRESS_MASK |
                                    Gdk::POINTER_MOTION_MASK |
                                    Gdk::POINTER_MOTION_HINT_MASK);
  show_all();
}
Example_DrawingArea::~Example_DrawingArea()
{
}

bool
Example_DrawingArea::on_drawingarea_scribble_expose_event(GdkEventExpose*
event)
{

  m_DrawingArea_Scribble.get_window()->draw_drawable(
    
m_DrawingArea_Scribble.get_style()->get_fg_gc(m_DrawingArea_Scribble.get_state()),
      m_refPixmap_Scribble,
//      Only copy the area that was exposed:
      event->area.x, event->area.y,
      event->area.x, event->area.y,
      event->area.width, event->area.height);

  return false;
}
bool
Example_DrawingArea::on_drawingarea_scribble_configure_event(GdkEventConfigure*)
{
   m_refPixmap_Scribble =
Gdk::Pixmap::create_from_xpm(m_DrawingArea_Scribble.get_window(),get_default_style()->get_bg(Gtk::STATE_NORMAL),"/home/silvia/Scrivania/Senza
nome.xpm");

  return true;
}

bool
Example_DrawingArea::on_drawingarea_scribble_motion_notify_event(GdkEventMotion*
event)
{
  if(!m_refPixmap_Scribble)
    return false; // paranoia check, in case we haven't gotten a configure
event

  if(event && event->window)
  {
    const Glib::RefPtr<Gdk::Window> refWindow =
        Glib::wrap((GdkWindowObject*) event->window, true); // true ==
take_copy

    if(refWindow)
    {
      int x = 0, y = 0;
      Gdk::ModifierType state = Gdk::ModifierType(0);

      refWindow->get_pointer(x, y, state);

      if((state & Gdk::BUTTON1_MASK) != 0)
{
        scribble_draw_brush(x, y);
std::cout<<"coord:" << event->x << "..." << event->y << std::endl;

}
}
  }

  return true;
}

bool
Example_DrawingArea::on_drawingarea_scribble_button_press_event(GdkEventButton*
event)
{
  if(!m_refPixmap_Scribble)
    return false; // paranoia check, in case we haven't gotten a configure
event

  if(event->button == 1)
{
    scribble_draw_brush(int(event->x), int(event->y));
//    std::cout<<"coord:" << event->x << "..." << event->y << std::endl;
}
 return true;
}
/* Draw a rectangle on the screen.
 */
void Example_DrawingArea::scribble_draw_brush(int x, int y)
{
  const Gdk::Rectangle update_rect (x - 3, y - 3, 6, 6);

  // Paint to the pixmap, where we store our state.
  //
  m_refPixmap_Scribble->draw_rectangle(
      m_DrawingArea_Scribble.get_style()->get_black_gc(),
      true,
      update_rect.get_x(), update_rect.get_y(),
      update_rect.get_width(), update_rect.get_height());

  // Now invalidate the affected region of the drawing area.
  m_DrawingArea_Scribble.get_window()->invalidate_rect(update_rect, false);
}


int main (int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);
  Example_DrawingArea DemoWindow;
  Gtk::Main::run(DemoWindow);
  return 0;
}

-- 
View this message in context: http://www.nabble.com/Scribble-with-rubber-tp18587111p18587111.html
Sent from the Gtkmm mailing list archive at Nabble.com.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]