Um dos principais motivos de estranhamento dos programadores que começam a usar Gtk+ talvez esteja em como dispôr elementos gráficos nas janelas. A maioria dos toolkits gráficos (bibliotecas com funções "ferramentas" gráficas) usam disposição com coordenadas x,y e tamanhos fixos. O Gtk+ usa elementos gráficos especiais cujo propósito principal é acomodar outros elementos.
A maior vantagem advinda dessa forma de pensar o layout é que os próprios elementos gráficos são capazes de adaptar seu tamanho e posição conforme o tamanho da janela.
Antes de conhecermos as tabelas e caixas verticais e horizontais vamos falar de containeres. Containeres são elementos em que você pode adicionar um único outro elemento. Uma janela, por exemplo, é uma GtkContainer. Vamos, então colocar uma etiqueta de texto na janela:
O que há de novo aqui é a criação de uma etiqueta de texto (GtkLabel), que veremos com mais detalhes depois. Note que esse elemento de texto também precisa ser mostrado! O importante para nós agora é a chamada à função gtk_container_add () que recebe a janela como primeiro argumento com casting para GtkContainer e a etiqueta de texto como elemento a ser adicionado. Note que você só pode adicionar 1 único elemento a um container.
Containeres são legais, mas só poder adicionar um elemento gráfico a uma janela não ajuda muito na usabilidade ;). Para adicionarmos mais elementos vamos ter de usar caixas ou tabelas. Vejamos um exemplo, então:
Que resulta na seguinte janela:
Dessa vez criamos uma caixa vertical (que, como podemos inferir a partir do nome, empacota elementos verticalmente) e empacotamos uma caixa horizontal como segundo "filho" dela. Note que a caixa vertical é criada (gtk_vbox_new ()) com verdadeiro como seu primeiro argumento. Isso significa que os filhos terão reservado para eles o mesmo espaço vertical, ou seja, o maior filho define o tamanho de todos os "compartimentos". Isso não acontece com a caixa horizontal como podemos perceber a partir da imagem. O segundo argumento define o espaço que irá separar os filhos.
Outras novas funções são introduzidas aqui: gtk_box_pack_start (), gtk_box_pack_end_defaults (), por exemplo. As funções da classe GtkBox servem para empacotar elementos gráficos nas caixas que criamos. O start serve para empacotar o próximo elemento a partir do começo, end empacota a partir do final. As opções TRUE que foram usadas nas funções servem para dizer que o elemento gráfico deve se expandir e ocupar todo o espaço fornecido pelo elemento de disposição (caixa), o quinto parâmetro especifica a quantidade de "preenchimento" (padding) que será incluído em volta do elemento gráfico. Note que, apesar de criarmos caixas de forma diferente (vbox para caixas verticais e hbox para caixas horizontais) usamos os métodos da classe mãe GtkBox para empacotar elementos.
Muitas vezes não precisamos fazer um controle mais preciso no preenchimento e outras propriedades de disposição. É para isso que servem as funções _defaults: elas definem o terceiro e quarto parâmetros como TRUE e o quinto como 0.
Uma forma que seja talvez mais prática de dispôr elementos gráficos talvez sejam as tabelas. Vejamos um exemplo simples:
Podemos perceber que uma tabela, nesse caso, simplifica as coisas. Nem sempre isso é verdade, mas provavelmente será na maior parte dos casos. Na criação de uma tabela passamos como argumento o número de linhas e colunas e, como terceiro argumento, se os "compartimentos" serão homogêneos.
A função gtk_table_attach_defaults () serve para anexar elementos na tabela. Aqui notamos uma das principais vantagens da tabela em comparação com as caixas: você especifica exatamente onde quer seu elemento. No caso das caixas você fica na dependência da ordem em que os adiciona, no caso da tabela você dá coordenadas e lá eles ficam. As coordenadas são dadas na forma: coluna de início, coluna de término, linha de início, linha de término, nessa ordem e começando de 0.
Por exemplo, se você tem uma tabela de 3 linhas por 4 colunas e quer colocar algo na segunda linha e nas duas colunas do meio, você especificaria 1, 3, 1, 2, veja:
Copyright © Gustavo Noronha Silva, 2004.