terça-feira, 14 de abril de 2009

Tutorial: Ícones

O que seria uma interface gráfica sem eles? Neste tutorial ensinarei a colocar ícones na janela (tanto o pequeno quanto o grande). Claro que ícones no FOX não servem apenas para isso, mas como eu só falei da janela principal, é lá que vamos colocá-los.

Um breve histórico

Acrescentar um ícone na interface FOX era bem trabalhoso. Primeiro, era preciso converter a imagem em um vetor (sim, um vetor estilo C) de pixels utilizando um programa chamado reswrap, distribuído junto com o FOX Toolkit. Sua sintaxe era:

reswrap [ options ] [ -o[a] arquivo_de_saida ] arquivos ...

Opções:
  • -o – Cria ou sobrescreve arquivo_de_saida
  • -oa – Acrescenta ao arquivo_de_saida
  • -e – Gera declaração de referência externa
  • -i – Gera um arquivo de cabeçalho

Assim, criavam-se dois arquivos, um icons.h com a declaração dos vetores, e um icons.cpp com o conteúdo deles. Era uma coisa monstruosa.

Todo este trabalho foi aliviado com a chegada de uma classe mágica: FXIconSource. Mas vamos ao código. Vou exibir aqui apenas as modificações relativas ao tutorial anterior.

FoxTutorialMainWindow.h
21 private:
22 void loadIcons();
23
24 void destroyIcons();
25
26 protected:
27 FXIcon *windowIcon;
28 FXIcon *windowMiniIcon;

Discussão

22/24: Métodos para carregar/destruir os ícones. Apenas por motivos de organização, deixando a tarefa centralizada.

27/28: Os dois ícones da janela.

O restante do arquivo permanece igual.

FoxTutorialMainWindow.cpp
18 FoxTutorialMainWindow::FoxTutorialMainWindow(FXApp *a)
19 : FXMainWindow(a, "Tutorial FOX", NULL, NULL, DECOR_ALL, 0, 0, 200, 200) {
20 loadIcons();
21
22 setIcon(windowIcon);
23 setMiniIcon(windowMiniIcon);
24 }

...

32 FoxTutorialMainWindow::~FoxTutorialMainWindow() {
33 destroyIcons();
34 }
35
36 /******************************************************************************/
37
38 void FoxTutorialMainWindow::loadIcons() {
39 FXIconSource iconSource(getApp());
40
41 windowIcon = iconSource.loadIconFile("icons/folders.gif");
42 windowMiniIcon = iconSource.loadScaledIconFile("icons/folders.gif", 16);
43 }
44
45 void FoxTutorialMainWindow::destroyIcons() {
46 delete windowIcon;
47 delete windowMiniIcon;
48 }

Discussão

20: Carrega os ícones. Descrição do método mais adiante.

22/23: Configura os ícones para a janela.

33: Ícones podem ser compartilhados (utilizados por mais de um widget por vez), portanto devem ser destruídos manualmente.

38-43: Nosso método para carregar os ícones.

39: Cria um objeto da classe FXIconSource. Apesar do nome, serve também para carregar imagens. Mas vamos com calma.
Cada ícone deve saber quem é sua aplicação, portanto o IconSource já deve vir com essa informação. Serve para que eles sejam criados junto com a aplicação.

41: Carrega um ícone do arquivo, retornando um ponteiro para o ícone.

42
: Idem, mas além de carregar, escala o ícone para que nenhuma de suas dimensões exceda o valor estabelecido (no caso, 16 pixels).

45-48: Nosso destrutor.
Conforme dito acima, precisamos destruir manualmente nossos ícones. delete é o suficiente para isso.

Resultado



Considerações finais

Por que GIF?

Apenas dois motivos: é suportado nativamente pelo FOX Toolkit e suporta transparência. Mas nada impede de usar outros formatos.

Créditos

---
Código-fonte deste tutorial.

Nenhum comentário: