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/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/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