Widgets
| Chapter 3. Basics |

## Widgets

gtkmm applications consist of windows containing widgets, such as buttons and text boxes. In some other systems, widgets are called "controls". For each widget in your application's windows, there is a C++ object in your application's code. So you just need to call a method of the widget's class to affect the visible widget.

Widgets are arranged inside container widgets such as frames and notebooks, in a hierarchy of widgets within widgets. Some of these container widgets, such as `Gtk::Grid`, are not visible - they exist only to arrange other widgets. Here is some example code that adds 2 `Gtk::Button` widgets to a `Gtk::Box` container widget:

    m_box.append(m_Button1);
    m_box.append(m_Button2);

and here is how to add the `Gtk::Box`, containing those buttons, to a `Gtk::Frame`, which has a visible frame and title:

    m_frame.set_child(m_box);

Most of the chapters in this book deal with specific widgets. See the Container Widgets section for more details about adding widgets to container widgets.

Although you can specify the layout and appearance of windows and widgets with C++ code, you will probably find it more convenient to design your user interfaces with `.ui` XML files and load them at runtime with `Gtk::Builder`. See the Gtk::Builder chapter.

Although gtkmm widget instances have lifetimes and scopes just like those of other C++ classes, gtkmm has an optional time-saving feature that you will see in some of the examples. The `Gtk::make_managed()` allows you to create a new widget and state that it will become owned by the container into which you place it. This allows you to create the widget, add it to the container and not be concerned about deleting it, since that will occur when the parent container (which may itself be managed) is deleted. You can learn more about gtkmm memory management techniques in the Memory Management chapter.

Headers and Linking |  | Signals