Xfce Foundation Classes
 « Main Page | Index

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 one of the following constructors:

AspectFrame();

AspectFrame(float xalign, float yalign);

AspectFrame(float xalign, float yalign, float ratio);

AspectFrame(const String& label, float xalign, float yalign, float ratio);

Aspect frames have an 'obey_child' (bool) and a 'ratio' (float) property. If obey_child is true, the aspect ratio of a child widget will match the aspect ratio of the size it requests. If obey_child is false the aspect ratio is given by the ratio property. When obey_child is true ratio is ignored. The 'xalign' and 'yalign' arguments specify the alignment, as with Alignment widgets.

The first constructor creates an AspectFrame with the default values: xalign 0.5, yalign 0.5, ratio 1.0 and obey_child true. The second constructor creates an AspectFrame with the specified xalign and yalign values. This constructor takes the aspect ratio from the requisition of the child and sets obey_child to true. The third constructor creates an AspectFrame with the specified xalign, yalign and ratio values. This constructor takes the aspect ratio from the ratio argument and sets obey_child to false. The fourth constructor creates a labeled AspectFrame with the specified xalign, yalign and ratio values. This constructor takes the aspect ratio from the ratio argument and sets obey_child to false.

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

void set(float xalign, float yalign, float ratio, bool obey_child);

AspectFrame is derived from Gtk::Frame so you can call the Frame methods that set the label, label widget or shadow type.

Aspect Frame Example

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.

The header file for the Aspect Frame example is <aspectframe.hh>:

#include <xfc/main.hh>
#include <xfc/gtk/window.hh>

using namespace Xfc;

class AspectFrameWindow : public Gtk::Window
{
public:
    AspectFrameWindow();
    virtual ~AspectFrameWindow();
};

and the source file is <aspectframe.cc>:

#include "aspectframe.hh"
#include <xfc/gtk/aspectframe.hh>
#include <xfc/gtk/drawingarea.hh>

AspectFrameWindow::AspectFrameWindow()
{
    set_title("Aspect Frame");
    set_border_width(10);

    // Create an aspect_frame and add it to our toplevel window
    Gtk::AspectFrame *aspect_frame = new Gtk::AspectFrame("2x1", 0.5, 0.5, 2);
    add(*aspect_frame);
    aspect_frame->show();

    // Now add a child widget to the aspect frame
    Gtk::DrawingArea *drawing_area = new Gtk::DrawingArea;

    // We ask for a 200x200 window but get a 200x100 window since we are forcing a 2x1 aspect ratio.
    drawing_area->set_size_request(200, 200);
    aspect_frame->add(*drawing_area);
    drawing_area->show();
}

AspectFrameWindow::~AspectFrameWindow()
{
}

int main (int argc, char *argv[])
{
    using namespace Main;

    init(&argc, &argv);

    AspectFrameWindow window;
    window.signal_destroy().connect(sigc::ptr_fun(&Xfc::Main::quit));
    window.show();

    run();
    return 0;
}

Compiling Aspect Frame

If you compiled and installed XFC yourself, you will find the source code for Aspect Frame in the <examples/howto/aspectframe> 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/howto/aspectframe> 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 Aspect Frame, add the following lines to a new text file and save it using the name "Makefile":

CC = g++

CFLAGS = -Wall -O2

aspectframe: aspectframe.cc aspectframe.hh
    $(CC) aspectframe.cc -o aspectframe $(CFLAGS) `pkg-config xfcui-X.X --cflags --libs`

clean:
    rm -f *.o aspectframe


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