Xfce Foundation Classes
« Main Page | Index
# Rulers Ruler widgets are used to indicate the location of the mouse pointer in a given window. A window can have a vertical ruler spanning across its width and a horizontal ruler spanning down its height. A small triangular indicator on the ruler shows the exact location of the pointer relative to the ruler. A ruler must first be created. You can create a horizontal ruler with the following constructors: `HRuler(); HRuler(Gtk::MetricType metric);` and a vertical ruler with these constructors: `VRuler();` `VRuler(Gtk::MetricType metric);` The first horizontal and vertical constructor will create a new ruler with the metric type of Gtk::PIXELS. The last horizontal and vertical constructor will create a new ruler with the specified metric type. Units of measure for rulers can be one of the following values from the Gtk::MetricType enum: PIXELS (the default) INCHES CENTIMETERS The metric type can be set at any time by calling: `void set_metric(Gtk::MetricType metric);` Other important characteristics of a ruler are how to mark the units of scale and where the position indicator is initially placed. These are set for a ruler using: `void set_range(double lower, double upper, double position, double max_size);` The 'lower' and 'upper' arguments define the extent of the ruler, and 'max_size' is the largest possible number that will be displayed. The 'position' argument defines the initial position of the pointer indicator within the ruler. A vertical ruler can span an 800 pixel wide window thus: `ruler->set_range(0, 800, 0, 800);` The markings displayed on the ruler will be from 0 to 800, with a number for every 100 pixels. If instead we wanted the ruler to range from 7 to 16, we would code like this instead: `ruler->set_range(7, 16, 0, 20);` The indicator on the ruler is a small triangular mark that indicates the position of the pointer relative to the ruler. If the ruler is used to follow the mouse pointer, the 'motion_notify_event' signal of the widget should be connected to the 'motion_notify_event' method of the ruler. To follow all mouse movements within a window area, you would use: `window->signal_motion_notify_event().connect(ruler, ruler->gtk_widget_class()->motion_notify_event);``` ## Ruler Example The following example creates a drawing area with a horizontal ruler above it and a vertical ruler to the left of it. The size of the drawing area is 600 pixels wide by 400 pixels high. The horizontal ruler spans from 7 to 13 with a mark every 100 pixels, while the vertical ruler spans from 0 to 400 with a mark every 100 pixels. Placement of the drawing area and the rulers is done using a table. The header file for the Ruler example is <rulers.hh> `#include <xfc/main.hh> #include <xfc/gtk/ruler.hh> #include <xfc/gtk/window.hh> using namespace Xfc; class RulerWindow : public Gtk::Window { public: RulerWindow(); ~RulerWindow(); };` and the source file is <rulers.cc> `#include "rulers.hh" #include <xfc/gtk/box.hh> #include <xfc/gtk/drawingarea.hh> #include <xfc/gtk/table.hh> #include <xfc/gtk/private/widgetclass.hh> RulerWindow::RulerWindow() { set_border_width(10); // Create a table for placing the ruler and the drawing area Gtk::Table *table = new Gtk::Table(3, 2); add(*table); Gtk::DrawingArea *area = new Gtk::DrawingArea(600, 400); table->attach(*area, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::FILL); area->set_events(Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); // The horizontal ruler goes on top. As the mouse moves across the drawing area, // a motion_notify_event is passed to the appropriate event handler for the ruler. Gtk::HRuler *hruler = new Gtk::HRuler; hruler->set_range(7, 13, 0, 20); table->attach(*hruler, 1, 2, 0, 1, Gtk::EXPAND | Gtk::SHRINK | Gtk::FILL, Gtk::FILL); // Some C code that connects the drawing area "motion_notify_event" directly to the hruler. GCallback callback = GCallback(GTK_WIDGET_GET_CLASS(hruler->gtk_widget())->motion_notify_event); g_signal_connect_swapped(area->g_object(), "motion_notify_event", callback, hruler->gtk_widget()); // The vertical ruler goes on the left. As the mouse moves across the drawing area, // a motion_notify_event is passed to the appropriate event handler for the ruler. Gtk::VRuler *vruler = new Gtk::VRuler; vruler->set_range(0, 400, 10, 400); table->attach(*vruler, 0, 1, 1, 2, Gtk::FILL, Gtk::EXPAND | Gtk::SHRINK | Gtk::FILL); // Some C code that connects the drawing area's "motion_notify_event" directly to the vruler. callback = GCallback(GTK_WIDGET_GET_CLASS(vruler->gtk_widget())->motion_notify_event); g_signal_connect_swapped(area->g_object(), "motion_notify_event", callback, vruler->gtk_widget()); // Now show everything show_all(); } RulerWindow::~RulerWindow() { } int main (int argc, char *argv[]) { using namespace Main; init(&argc, &argv); RulerWindow window; window.signal_destroy().connect(sigc::ptr_fun(&Xfc::Main::quit)); run(); return 0; }` ## Compiling Ruler If you compiled and installed XFC yourself, you will find the source code for Ruler in the <examples/rulers> source directory along with a Makefile. If XFC came pre-installed, or you installed it from an RPM package, you will find the source code in the </usr/share/doc/xfcui-X.X/examples/rulers> subdirectory. In this case you will have to create the Makefile yourself (replace X.X with the version number of the libXFCui library you have installed). To create a Makefile for Ruler, add the following lines to a new text file and save it using the name "Makefile": `CC = g++ CFLAGS = -Wall -O2 rulers: rulers.cc rulers.hh $(CC) rulers.cc -o rulers $(CFLAGS) `pkg-config xfcui-X.X --cflags --libs` clean: rm -f *.o rulers` If you cut and paste these lines make sure the whitespace before $(CC) and rm is a tab character. When you compile and run this program you will see the following window appear:
Copyright © 2004-2005 The XFC Development Team | Top | XFC 4.4