# GTK+/Empacotando widgets

Capítulo 5: Empacotando Widgets
Quando se cria um aplicativo, você vai querer colocar mais que um widget em uma janela. Nosso primeiro exemplo helloworld utilizou apenas um widget tal que nós podemos simplesmente user uma chamada gtk_container_add para "empacotar" o widget na janela. Mas quando você colocar mais que um widget na janela, como pode controlar onde o widget é posicionado?

## Teoria do empacotamento de caixas

Muitos empacotamentos são feitos criando caixas. Estes são recipientes invisíveis de widgets que nós podemos empacotar nossos widgets, no qual vem em duas formas, uma caixa horizontal e uma caixa vertical. Quando empacotar widgets em caixas horizontais, os objetos são inseridos horizontalmente da esquerda para a direita ou da direita para a esquerda, dependendo da chamada usada. Na caixa vertical, widgets são empacotados de cima para baixo ou vice versa. Você pode usar qualquer combinação de caixas dentro ou ao lado de outras caixas para criar o efeito desejado.
Para criar uma nova caixa horizontal, usamos uma chamada para gtk_hbox_new, e para caixas verticais, gtk_vbox_new. As funções gtk_box_pack_start e gtk_box_pack_end são usadas para colocar objetos dentro destes recipientes. A função gtk_box_start iniciará no topo e seguirá para baixo em uma vbox, e empacota da esquerda para a direita em um hbox. Estas funções permitem justificar pela direita ou pela esquerda nossos widgets e podem ser misturados a fim de se obter o efeito desejado. Utilizaremos gtk_box_pack_start em muitos dos nossos exemplos. Um objeto pode ser um outro recipiente ou um widget. De fato, muitos widgets são na verdade recipientes, inclusive o botão, mas costumamos utilizar apenas uma label no botão.
Através destas chamadas, GTK sabe onde você quer colocar seus widgets tal que eles podem executar uma re-escala automática e outras coisas. Existe também um número de opções para as quais seus widgets podem ser empacotados. Como você pode imaginar, este método nos dá uma boa flexibilidade quando colocamos e criamos widgets.

## Detalhes das caixas

Devido a essa flexibilidade as caixas de empacotamento do GTK, a princípio, podem causar confusão. Existem muitas opções e não fica logo evidente como elas se ajustam.
Cada linha contém uma caixa horizontal (hbox) com vários botões. A chamada para gtk_box_pack é abreviação para a chamada de empacotamento de cada um dos botões na hbox. Cada botão é empacotado na hbox da mesma maneira (os mesmos argumentos da função gtk_box_pack_start).
Esta é a declaração da função gtk_box_pack_start.
O primeiro argumento é a caixa na qual você esta empacotando o objeto, e o segundo é o objeto. Os objetos, por hora, serão botões, então vamos empacotar os botões nas caixas.
O argumento de expansão para gtk_box_pack_start e gtk_box_pack_end controla se os widgets se expandem para preencher todo o espaço extra na caixa (TRUE); ou a caixa se encolhe para apenas ajustar aos widgets (FALSE). Declarar expand como FALSE permite a voce justificação à direita ou à esquerda dos seus widgets. De outra maneira eles vão expandir para se ajustar na caixa, o mesmo efeito acontece escolhendo apenas um, gtk_box_pack_start ou gtk_box_pack_end.
O argumento de preenchimento para as funções gtk_box_pack controla se o espaço extra nos objetos -botões- (TRUE), ou como espaço extra entre cada objeto. Ele apenas tem efeito se o argumento expand esta TRUE.
Ao se criar uma nova caixa, a função parece assim:
O argumento homogeneous gtk_hbox_new (o mesmo para gtk_vbox_new) controla se os objetos na caixa terão o mesmo tamanho (isto é, a mesma largura numa hbox ou a mesma altura numa vbox). Se ele é selecionado, as rotinas do gtk_box_pack funcionam como se o argumento expand estivesse sempre ativo (TRUE).
Qual a diferença entre spacing (quando a caixa é criada) e padding (quando os elementos são empacotados)? Spacing controla o espaço entre os objetos e padding o espaço a cada lado do objeto. A seguinte figura torna isso claro:
Aqui está o código utilizado para criar as duas imagens. Comentei completamente, assim espero que você não tenha problemas ao examiná-lo. Voce pode compilar e executar.

## Ver também

* Programação em GUI/Widgets - conceitos