### Tutorial

« The Alignment Widget | Layout Container »

## Fixed Container

The Fixed container allows you to place widgets at a fixed position within its window, relative to its upper left hand corner. The position of the widgets can be changed dynamically.
There are only a few methods associated with the fixed widget:

`Fixed(); Fixed(Widget& widget, int x, int y);`

The first constructor creates an empty fixed container, the second creates a fixed container an places the specified widget fixed at position x and y.

`void put(Widget& widget, int x, int y); void move(Widget& widget, int x, int y);`

Gtk::Fixed::put() places widget in the container fixed at the position specified by x and y.
Gtk::Fixed::move() allows the specified widget to be moved to a new position.

`void set_has_window(bool has_window); bool get_has_window() const;`

Normally, Fixed widgets don't have their own X window. Since this is different from the behaviour of Fixed widgets in earlier releases of GTK, the method Gtk::Fixed::set_has_window() allows the creation of Fixed widgets with their own window. It has to be called before realizing the widget.
The following example illustrates how to use the Fixed Container.
The header file for Fixed Container is fixed.h:

`#include<inti/main.h> #include <inti/core.h> #include <inti/gtk/fixed.h> #include <inti/gtk/button.h> using namespace Inti; class FixedWindow : public Gtk::Window { int x; int y; Gtk::Fixed *fixed; protected: void on_move_button(Gtk::Button *button); public: FixedWindow(); virtual ~FixedWindow(); };`

and the source file is fixed.cc:

`#include"fixed.h"
#include <inti/gtk/button.h>
#include <inti/bind.h>
FixedWindow::FixedWindow()
: x(30), y(50), fixed(0)
{
set_title("Fixed Container");
set_border_width(10);
// Create a Fixed Container
fixed = new Gtk::Fixed;
add(*fixed);
fixed->show();
for (int i = 1 ; i <= 3 ; i++)
{
// Creates a new button with the label "Press me"
Gtk::Button *button = new Gtk::Button("Press me");
// When the button receives the "clicked" signal, it will call the move_button() slot
// passing it the Fixed Container as its argument.
button->sig_clicked().connect(bind(slot(this, &FixedWindow::on_move_button), button));
// This packs the button into the fixed containers window.
fixed->put(*button, i * 50, i * 50);
// The final step is to display this newly created widget.
button->show();
}`
`}
FixedWindow::~FixedWindow()
{
}
void
FixedWindow::on_move_button(Gtk::Button *button)
{
x = (x + 30) % 300;
y = (y + 50) % 300;
fixed->move(*button, x, y);
}
INTI_MAIN(FixedWindow)`

The INTI_MAIN macro is a convenience macro that writes a simple main function, its only argument is the name of the main window class. The macro is defined in `<inti/main.h>` as:

`#define INTI_MAIN(MainWidget)\ int main (int argc, char *argv[])\ {\ Inti::Main::init(&argc, &argv);\ MainWidget main_widget;\ main_widget.sig_destroy().connect(slot(&Inti::Main::quit));\ main_widget.show();\ Inti::Main::run();\ return 0;\ }`

``Most main functions in C++ are as simple as this because all the creation work for the main window is done inside its constructor, not the main function.

« The Alignment Widget | Index Container Widgets Top | Layout Container »