GtkDrawingArea Constructor

Use the constructor to create a new empty, drawing area widget.

In the example, we use the "expose-event" to draw a simple checkerboard. A word of caution, this example is not intented to illustrate a real-world use of this widget, because the same effect can be brought in a much easier manner using a GtkImage. What is important to understand is the underlying concept of how the widget works.

Example 52. Simple checkerboard using a GtkDrawingArea

<?php

/* Define some constants */
define("SIZE", 10);
define("SPACING", 2);

/* The drawing area's Expose Event Callback */
function doExpose($widget, $event)
{
    /* Red and White colors for the squares */
    $color1 = new GdkColor(30000, 0, 30000);
    $color2 = new GdkColor(65535, 65535, 65535);

    /* A graphics context for the red box */
    $gc1 = new GdkGC($widget->window);
    $gc1->set_rgb_fg_color($color1);

    /* A graphics context for the white box */
    $gc2 = new GdkGC($widget->window);
    $gc2->set_rgb_fg_color($color2);

    /* Values to start painting with */
    $xcount = 0;
    $x = SPACING;

    /* Traverse columns */
    while ($x < $widget->allocation->width)
    {
        $y = SPACING;
        $ycount = $xcount % 2;

        /* Traverse rows */
        while ($y < $widget->allocation->height)
        {
            /* Even number mean paint red box, else white box */
            if ($ycount % 2) {
                $gc = $gc1;
            } else {
                $gc = $gc2;
            }

            /* Paint a rectangle measuring SIZExSIZE */
            $widget->window->draw_rectangle($gc, true, $x, $y, SIZE, SIZE);

            /* Next row */
            $y += SIZE + SPACING;
            ++$ycount;
        }

        /* Next column */
        $x += SIZE + SPACING;
        ++$xcount;
    }

    /* Job's done, no more painting! */
    return true;
}

/* Create the Window and Drawing area objects */
$win = new GtkWindow();
$dra = new GtkDrawingArea();

/* Connect callbacks and start */
$dra->connect('expose-event', 'doExpose');
$win->connect_simple('destroy', array('Gtk', 'main_quit'));

$win->set_title('Drawing Area Demo');
$win->add($dra);
$win->set_size_request(250,250);
$win->show_all();

Gtk::main();

?>