Aspect Frames

GTK+ 2.0 Tutorial
<<< Previous | Container Widgets | Next >>>

# Aspect Frames

The aspect frame widget is like a frame widget, except that it also enforces the aspect ratio (that is, the ratio of the width to the height) of the child widget to have a certain value, adding extra space if necessary. This is useful, for instance, if you want to preview a larger image. The size of the preview should vary when the user resizes the window, but the aspect ratio needs to always match the original image.

To create a new aspect frame use:

    GtkWidget *gtk_aspect_frame_new( const gchar *label,
                                     gfloat       xalign,
                                     gfloat       yalign,
                                     gfloat       ratio,
                                     gboolean     obey_child);

`xalign` and `yalign` specify alignment as with Alignment widgets. If `obey_child` is TRUE, the aspect ratio of a child widget will match the aspect ratio of the ideal size it requests. Otherwise, it is given by `ratio`.

To change the options of an existing aspect frame, you can use:

    void gtk_aspect_frame_set( GtkAspectFrame *aspect_frame,
                               gfloat          xalign,
                               gfloat          yalign,
                               gfloat          ratio,
                               gboolean        obey_child);

As an example, the following program uses an AspectFrame to present a drawing area whose aspect ratio will always be 2:1, no matter how the user resizes the top-level window.

    #include <gtk/gtk.h>

    int main( int argc,
              char *argv[] )
    {
        GtkWidget *window;
        GtkWidget *aspect_frame;
        GtkWidget *drawing_area;
        gtk_init (&argc, &argv);

        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (window), "Aspect Frame");
        g_signal_connect (window, "destroy",
    	              G_CALLBACK (gtk_main_quit), NULL);
        gtk_container_set_border_width (GTK_CONTAINER (window), 10);

        /* Create an aspect_frame and add it to our toplevel window */

        aspect_frame = gtk_aspect_frame_new ("2x1", /* label */
                                             0.5, /* center x */
                                             0.5, /* center y */
                                             2, /* xsize/ysize = 2 */
                                             FALSE /* ignore child's aspect */);

        gtk_container_add (GTK_CONTAINER (window), aspect_frame);
        gtk_widget_show (aspect_frame);

        /* Now add a child widget to the aspect frame */

        drawing_area = gtk_drawing_area_new ();

        /* Ask for a 200x200 window, but the AspectFrame will give us a 200x100
         * window since we are forcing a 2x1 aspect ratio */
        gtk_widget_set_size_request (drawing_area, 200, 200);
        gtk_container_add (GTK_CONTAINER (aspect_frame), drawing_area);
        gtk_widget_show (drawing_area);

        gtk_widget_show (window);
        gtk_main ();
        return 0;
    }

<<< Previous | Home | Next >>>
Frames | Up | Paned Window Widgets