quarta-feira, 15 de abril de 2009

FXTopWindow: Decorações e Posicionamento de Janelas

Quando falei sobre criar a janela principal (aqui), citei alguns aspectos relativos às decorações da janela e seu posicionamento, informando que isto era definido em FXTopWindow.h, onde está definida a superclasse direta de FXMainWindow.

Falarei agora especificamente desses dois assuntos.

Decorações

As decorações são itens "extras" que o seu decorador de janelas acrescenta. São as bordas da janela, barra de título, botões de minimizar, maximizar, fechar, menu da janela etc. FXTopWindow.h define a seguinte enumeração:

enum {
DECOR_NONE = 0,
DECOR_TITLE = 0x00020000,
DECOR_MINIMIZE = 0x00040000,
DECOR_MAXIMIZE = 0x00080000,
DECOR_CLOSE = 0x00100000,
DECOR_BORDER = 0x00200000,
DECOR_SHRINKABLE = 0x00400000,
DECOR_STRETCHABLE = 0x00800000,
DECOR_RESIZE = DECOR_SHRINKABLE|DECOR_STRETCHABLE,
DECOR_MENU = 0x01000000,
DECOR_ALL = (DECOR_TITLE |
DECOR_MINIMIZE |
DECOR_MAXIMIZE |
DECOR_CLOSE |
DECOR_BORDER |
DECOR_SHRINKABLE |
DECOR_STRETCHABLE |
DECOR_MENU
)
};

Apesar de serem bem intuitivos os nomes, vou explicá-los:
  • DECOR_NONE: Janela sem bordas, sem nada, só com o conteúdo. Se parecer inútil, pense em uma janela em modo tela cheia.
  • DECOR_TITLE: Título da janela.
  • DECOR_MINIMIZE: Adiciona a capacidade de minimizar a janela.
  • DECOR_MAXIMIZE: Adiciona a capacidade de maximizar a janela.
  • DECOR_CLOSE: Adiciona a capacidade de fechar a janela.
  • DECOR_BORDER: Adiciona bordas à janela.
  • DECOR_SHRINKABLE: Possibilita diminuir o tamanho da janela.
  • DECOR_STRETCHABLE: Possibilita aumentar o tamanho da janela.
  • DECOR_RESIZE: Permite aumentar ou diminuir a janela. Perceba que é apenas uma combinação das duas anteriores para facilitar.
  • DECOR_MENU: Habilita o menu da janela.
  • DECOR_ALL: Já conhecido, habilita todo mundo.

Agora a pergunta: se é tão intuitivo, porque explicar cada um? Simples. Essas são apenas sugestões para o decorador de janelas. Não são regras.

Isso quer dizer que, se o decorador achar melhor desenhar um item que você não especificou, ele desenha. Por isso eu não falei "Desenha isso", "Desenha aquilo", mas sim "Adiciona a capacidade", "Habilita". Por exemplo, para exibir o botão de fechar, tem que ter a barra de título (e com certeza as bordas vêm de brinde). Acontece também de se especificarem somente os botões de minimizar e fechar, mas o de maximizar aparece junto, desabilitado.

O que eu quero dizer é que cada decorador tem suas regras próprias, e que essas são apenas sugestões. Mas tenha certeza que o que você especificar ele faz. E se não especificar, também não faz; ou seja, se você não quer que a janela aumente de tamanho nem maximize, ela não irá, embora o botão de maximizar esteja lá (desabilitado, claro).

Não quero dizer, por outro lado, que você deva confiar sempre nos itens que vêm de "brinde". Especifique sempre os que você quer ter certeza que estejam disponíveis.

Posicionamento

Para mostrar a janela, chamei o método show(), passando PLACEMENT_SCREEN como parâmetro, exibindo no meio da tela. As opções de posicionamento são:
enum {
PLACEMENT_DEFAULT,
PLACEMENT_VISIBLE,
PLACEMENT_CURSOR,
PLACEMENT_OWNER,
PLACEMENT_SCREEN,
PLACEMENT_MAXIMIZED
};

  • PLACEMENT_DEFAULT: No tamanho e posição que foram especificados no construtor.
  • PLACEMENT_VISIBLE: Posiciona a janela para ficar totalmente visível. Confesso que nunca usei...
  • PLACEMENT_CURSOR: Posiciona onde está o cursor do mouse.
  • PLACEMENT_OWNER: Posiciona no centro da janela dona desta. Quando adicionarmos mais janelas, esta opção será utilizada.
  • PLACEMENT_SCREEN: Já conhecido, posiciona no centro da tela.
  • PLACEMENT_MAXIMIZED: Deixa a janela do tamanho da tela. Mas tem uma ressalva.

O PLACEMENT_MAXIMIZED realmente deixa a janela do tamanho da tela. Porém, dependendo do decorador (sempre ele...) as bordas vão todas embora. Dos que eu já usei (foram só três, mas tudo bem), só o Emerald (sempre ele...) preservou as bordas, deixando a janela do jeito que se imagina que uma janela maximizada deva ser. O decorador do Windows (não sei o nome) e o gtk-window-decorator (decorador padrão do GNOME) sumiram com as bordas.

E se eu quiser que a janela já inicie maximizada, com borda e tudo?

Chame maximize() em vez de show().

2 comentários:

eduardo4jesus disse...

Olá Edgar, to com uma dúvida:

- Quero que a minha janela seja desenhada no canto superior direito da tela.

- Sei que tenho que usar show(PLACEMENT_DEFAULT)

...e no construtor devo especificar a posição na tela, mas o problema é que:

Tal posição depende da resolução de vídeo que o usuário esteja usando na sua máquina.

Então se eu colocar uma posição que fique no canto superior direito para uma resolução de 1280 x 800 (wide)Em uma outra com 1024x768 de resolução, a janela não será desenhada na posição desejada.

Pergunta: Como ler a resolução da máquina do usuário? É feito pelo Fox? ou tem uma biblioteca especifica para isso?

Edgar Diniz disse...

Olá, Eduardo.

Para isso, utilize:

FXRootWindow *rootWindow = getApp()->getRootWindow();

int width = rootWindow->getWidth();
int height = rootWindow->getHeight();

FXRootWindow representa o desktop, e é derivada de FXComposite, então tudo que estiver disponível em FXComposite estará também em FXRootWindow.

Para maiores detalhes, verifique a referência de classes do FOX:

http://fox-toolkit.org/ref16/classes.html (versão 1.6)
http://fox-toolkit.org/ref/classes.html (versão em desenvolvimento 1.7)