00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <gtk--/main.h>
00027 #include <gtk--/style.h>
00028 #include <gtk--/window.h>
00029 #include <gtk--/button.h>
00030 #include <gtk--/box.h>
00031 #include <gtk--/drawingarea.h>
00032 #include <iostream>
00033
00034
00035 class ScribbleDrawingArea : public Gtk::DrawingArea
00036 {
00037
00038
00039 Gdk_Pixmap pixmap;
00040 Gdk_GC gc;
00041 Gdk_Window win;
00042 Gdk_Visual visual;
00043
00044 virtual gint configure_event_impl (GdkEventConfigure *event);
00045 virtual gint expose_event_impl (GdkEventExpose *event);
00046 virtual gint button_press_event_impl (GdkEventButton *event);
00047 virtual gint motion_notify_event_impl (GdkEventMotion *event);
00048 void draw_brush (gdouble x, gdouble y);
00049
00050 public:
00051 ScribbleDrawingArea ();
00052
00053 };
00054
00055 ScribbleDrawingArea::ScribbleDrawingArea()
00056 : Gtk::DrawingArea(), pixmap (0)
00057 {
00058 set_events (GDK_EXPOSURE_MASK
00059 | GDK_LEAVE_NOTIFY_MASK
00060 | GDK_BUTTON_PRESS_MASK
00061 | GDK_POINTER_MOTION_MASK
00062 | GDK_POINTER_MOTION_HINT_MASK);
00063 }
00064
00065
00066
00067 int ScribbleDrawingArea::configure_event_impl (GdkEventConfigure * )
00068 {
00069 win = get_window();
00070 visual = win.get_visual();
00071
00072 if (pixmap)
00073 pixmap.release();
00074 gc = get_style()->gtkobj()->white_gc;
00075
00076
00077 pixmap.create(get_window(), width(), height());
00078
00079 pixmap.draw_rectangle (gc,
00080 TRUE,
00081 0, 0,
00082 width(),
00083 height());
00084
00085 return TRUE;
00086 }
00087
00088
00089 int ScribbleDrawingArea::expose_event_impl (GdkEventExpose *event)
00090 {
00091
00092 gc = get_style()->gtkobj()->fg_gc[GTK_WIDGET_STATE (GTK_WIDGET(gtkobj()))];
00093
00094
00095 win.draw_pixmap(gc ,
00096 pixmap,
00097 event->area.x, event->area.y,
00098 event->area.x, event->area.y,
00099 event->area.width, event->area.height);
00100
00101 return FALSE;
00102 }
00103
00104
00105 void ScribbleDrawingArea::draw_brush (gdouble x, gdouble y)
00106 {
00107 GdkRectangle update_rect;
00108 update_rect.x = (int)x - 5;
00109 update_rect.y = (int)y - 5;
00110 update_rect.width = 10;
00111 update_rect.height = 10;
00112 gc = get_style()->gtkobj()->black_gc;
00113 pixmap.draw_rectangle(
00114 gc,
00115 TRUE,
00116 update_rect.x, update_rect.y,
00117 update_rect.width, update_rect.height);
00118 draw(&update_rect);
00119
00120 }
00121
00122 gint ScribbleDrawingArea::button_press_event_impl (GdkEventButton *event)
00123 {
00124 if (event->button == 1 && pixmap)
00125 draw_brush (event->x, event->y);
00126
00127 return TRUE;
00128 }
00129
00130 gint ScribbleDrawingArea::motion_notify_event_impl (GdkEventMotion *event)
00131 {
00132 int x, y;
00133 GdkModifierType state;
00134 if (event->is_hint)
00135 gdk_window_get_pointer (event->window, &x, &y, &state);
00136 else
00137 {
00138 x = (int)event->x;
00139 y = (int)event->y;
00140 state = (GdkModifierType) event->state;
00141 }
00142
00143 if (state & GDK_BUTTON1_MASK && pixmap)
00144 draw_brush (x, y);
00145
00146 return TRUE;
00147 }
00148
00149
00150 class ScribbleWindow : public Gtk::Window
00151 {
00152
00153 Gtk::VBox vbox;
00154 ScribbleDrawingArea drawing_area;
00155 Gtk::Button button;
00156 void quit ();
00157 public:
00158 ScribbleWindow ();
00159 };
00160
00161 void ScribbleWindow::quit ()
00162 {
00163 Gtk::Main::quit();
00164 }
00165
00166 ScribbleWindow::ScribbleWindow ()
00167 : Gtk::Window(GTK_WINDOW_TOPLEVEL),
00168 vbox (FALSE, 0),
00169 button ("quit")
00170 {
00171 add (vbox);
00172
00173
00174 drawing_area.size (400, 400);
00175 vbox.pack_start (drawing_area, TRUE, TRUE, 0);
00176
00177
00178
00179 vbox.pack_start (button, FALSE, FALSE, 0);
00180
00181 button.clicked.connect(slot(*this, &ScribbleWindow::quit));
00182 destroy.connect(slot(*this, &ScribbleWindow::quit));
00183
00184 drawing_area.show();
00185 button.show();
00186 vbox.show();
00187 }
00188
00189 int
00190 main (int argc, char *argv[])
00191 {
00192 ScribbleWindow *window;
00193 Gtk::Main myapp(argc, argv);
00194
00195 window = new ScribbleWindow;
00196 window->show();
00197
00198 myapp.run();
00199
00200 return 0;
00201 }