Sobre a interface de vários documentos

Cada documento em um aplicativo MDI (interface de vários documentos) é exibido em uma janela filho separada dentro da área do cliente da janela main do aplicativo. Aplicativos MDI típicos incluem aplicativos de processamento de palavras que permitem que o usuário trabalhe com vários documentos de texto e aplicativos de planilha que permitem que o usuário trabalhe com vários gráficos e planilhas. Para obter mais informações, consulte os tópicos a seguir.

Frame, Client e Child Windows

Um aplicativo MDI tem três tipos de janelas: uma janela de quadro, uma janela de cliente MDI, bem como várias janelas filho. A janela de quadro é como a janela main do aplicativo: ela tem uma borda de dimensionamento, uma barra de título, um menu de janela, um botão minimizar e um botão maximizar. O aplicativo deve registrar uma classe de janela para a janela de quadro e fornecer um procedimento de janela para dar suporte a ela.

Um aplicativo MDI não exibe a saída na área do cliente da janela de quadros. Em vez disso, ele exibe a janela do cliente MDI. Uma janela do cliente MDI é um tipo especial de janela filho pertencente à classe de janela pré-registerada MDICLIENT. A janela do cliente é um filho da janela de quadro; ele serve como o plano de fundo para janelas filho. Ele também fornece suporte para criar e manipular janelas filho. Por exemplo, um aplicativo MDI pode criar, ativar ou maximizar janelas filho enviando mensagens para a janela do cliente MDI.

Quando o usuário abre ou cria um documento, a janela do cliente cria uma janela filho para o documento. A janela do cliente é a janela pai de todas as janelas filho MDI no aplicativo. Cada janela filho tem uma borda de dimensionamento, uma barra de título, um menu de janela, um botão minimizar e um botão maximizar. Como uma janela filho é recortada, ela está confinada à janela do cliente e não pode aparecer fora dela.

Um aplicativo MDI pode dar suporte a mais de um tipo de documento. Por exemplo, um aplicativo de planilha típico permite que o usuário trabalhe com gráficos e planilhas. Para cada tipo de documento compatível, um aplicativo MDI deve registrar uma classe de janela filho e fornecer um procedimento de janela para dar suporte às janelas pertencentes a essa classe. Para obter mais informações sobre classes de janela, consulte Classes de janela. Para obter mais informações sobre procedimentos de janela, consulte Procedimentos de janela.

A seguir está um aplicativo MDI típico. Ele se chama Multipad.

janela do quadro do aplicativo mdi multipad e janela do cliente

Criação de janela filho

Para criar uma janela filho, um aplicativo MDI chama a função CreateMDIWindow ou envia a mensagem WM_MDICREATE para a janela do cliente MDI. Uma maneira mais eficiente de criar uma janela filho MDI é chamar a função CreateWindowEx , especificando a WS_EX_MDICHILD estilo estendido.

Para destruir uma janela filho, um aplicativo MDI envia uma mensagem WM_MDIDESTROY para a janela do cliente MDI.

Ativação da janela filho

Qualquer número de janelas filho pode aparecer na janela do cliente de uma só vez, mas apenas uma pode estar ativa. A janela filho ativa está posicionada na frente de todas as outras janelas filho e sua borda está realçada.

O usuário pode ativar uma janela filho inativa clicando nela. Um aplicativo MDI ativa uma janela filho enviando uma mensagem WM_MDIACTIVATE para a janela do cliente MDI. À medida que a janela do cliente processa essa mensagem, ela envia uma mensagem WM_MDIACTIVATE para o procedimento de janela da janela filho a ser ativado e para o procedimento de janela da janela filho que está sendo desativada.

Para impedir que uma janela filho seja ativada, manipule a mensagem WM_NCACTIVATE para a janela filho retornando FALSE.

O sistema controla a posição de cada janela filho na pilha de janelas sobrepostas. Esse empilhamento é conhecido como Ordem Z. O usuário pode ativar a próxima janela filho no pedido Z clicando em Avançar no menu da janela na janela ativa. Um aplicativo ativa a próxima (ou anterior) janela filho na ordem Z enviando uma mensagem WM_MDINEXT para a janela do cliente.

Para recuperar o identificador para a janela filho ativa, o aplicativo MDI envia uma mensagem WM_MDIGETACTIVE para a janela do cliente.

Vários menus de documentos

A janela de quadro de um aplicativo MDI deve incluir uma barra de menus com um menu de janela. O menu da janela deve incluir itens que organizam as janelas filho dentro da janela do cliente ou que fecham todas as janelas filho. O menu de janela de um aplicativo MDI típico pode incluir os itens na tabela a seguir.

Item de menu Finalidade
Bloco Organiza janelas filho em um formato de bloco para que cada uma apareça em sua totalidade na janela do cliente.
Cascata Organiza janelas filho em um formato em cascata. As janelas filho se sobrepõem umas às outras, mas a barra de título de cada uma delas é visível.
Organizar Ícones Organiza os ícones de janelas filho minimizadas ao longo da parte inferior da janela do cliente.
Fechar tudo Fecha todas as janelas filho.

 

Sempre que uma janela filho é criada, o sistema acrescenta automaticamente um novo item de menu ao menu da janela. O texto do item de menu é o mesmo que o texto na barra de menus da nova janela filho. Ao clicar no item de menu, o usuário pode ativar a janela filho correspondente. Quando uma janela filho é destruída, o sistema remove automaticamente o item de menu correspondente do menu da janela.

O sistema pode adicionar até dez itens de menu ao menu da janela. Quando a décima janela filho é criada, o sistema adiciona o item Mais Windows ao menu da janela. Clicar neste item exibe a caixa de diálogo Selecionar Janela . A caixa de diálogo contém uma caixa de listagem com os títulos de todas as janelas filho MDI disponíveis no momento. O usuário pode ativar uma janela filho clicando em seu título na caixa de listagem.

Se o aplicativo MDI der suporte a vários tipos de janelas filho, adapte a barra de menus para refletir as operações associadas à janela ativa. Para fazer isso, forneça recursos de menu separados para cada tipo de janela filho compatível com o aplicativo. Quando um novo tipo de janela filho é ativado, o aplicativo deve enviar uma mensagem WM_MDISETMENU para a janela do cliente, passando para ela o identificador para o menu correspondente.

Quando nenhuma janela filho existe, a barra de menus deve conter apenas itens usados para criar ou abrir um documento.

Quando o usuário está navegando pelos menus de um aplicativo MDI usando chaves de cursor, as chaves se comportam de forma diferente do que quando o usuário está navegando pelos menus de um aplicativo típico. Em um aplicativo MDI, o controle passa do menu da janela do aplicativo para o menu da janela da janela filho ativa e, em seguida, para o primeiro item na barra de menus.

Vários aceleradores de documento

Para receber e processar chaves de acelerador para suas janelas filho, um aplicativo MDI deve incluir a função TranslateMDISysAccel em seu loop de mensagem. O loop deve chamar TranslateMDISysAccel antes de chamar a função TranslateAccelerator ou DispatchMessage .

As teclas de acelerador no menu da janela de uma janela filho MDI são diferentes daquelas para uma janela filho não MDI. Em uma janela filho MDI, a combinação de teclas ALT+ – (menos) abre o menu da janela, a combinação de teclas CTRL+F4 fecha a janela filho ativa e a combinação de teclas CTRL+F6 ativa a próxima janela filho.

Tamanho e disposição da janela filho

Um aplicativo MDI controla o tamanho e a posição de suas janelas filho enviando mensagens para a janela do cliente MDI. Para maximizar a janela filho ativa, o aplicativo envia a mensagem WM_MDIMAXIMIZE para a janela do cliente. Quando uma janela filho é maximizada, sua área de cliente preenche completamente a janela do cliente MDI. Além disso, o sistema oculta automaticamente a barra de título da janela filho e adiciona o ícone de menu da janela filho e o botão Restaurar à barra de menus do aplicativo MDI. O aplicativo pode restaurar a janela do cliente para seu tamanho e posição originais (premaximizados) enviando à janela do cliente uma mensagem WM_MDIRESTORE .

Um aplicativo MDI pode organizar suas janelas filho em um formato de cascata ou de bloco. Quando as janelas filho são colocadas em cascata, as janelas aparecem em uma pilha. A janela na parte inferior da pilha ocupa o canto superior esquerdo da tela e as janelas restantes são deslocadas vertical e horizontalmente para que a borda esquerda e a barra de título de cada janela filho fiquem visíveis. Para organizar janelas filho no formato em cascata, um aplicativo MDI envia a mensagem WM_MDICASCADE . Normalmente, o aplicativo envia essa mensagem quando o usuário clica em Cascata no menu da janela.

Quando as janelas filho são lado a lado, o sistema exibe cada janela filho em sua totalidade , sobrepondo nenhuma das janelas. Todas as janelas são dimensionadas, conforme necessário, para caber dentro da janela do cliente. Para organizar janelas filho no formato de bloco, um aplicativo MDI envia uma mensagem WM_MDITILE para a janela do cliente. Normalmente, o aplicativo envia essa mensagem quando o usuário clica em Bloco no menu da janela.

Um aplicativo MDI deve fornecer um ícone diferente para cada tipo de janela filho compatível. O aplicativo especifica um ícone ao registrar a classe de janela filho. O sistema exibe automaticamente o ícone de uma janela filho na parte inferior da janela do cliente quando a janela filho é minimizada. Um aplicativo MDI direciona o sistema para organizar ícones de janela filho enviando uma mensagem WM_MDIICONARRANGE para a janela do cliente. Normalmente, o aplicativo envia essa mensagem quando o usuário clica em Organizar Ícones no menu da janela.

Ícone Título do Windows

Como as janelas filho MDI podem ser minimizadas, um aplicativo MDI deve evitar manipular janelas de título de ícone como se fossem janelas filho MDI normais. Janelas de título de ícone aparecem quando o aplicativo enumera janelas filho da janela do cliente MDI. As janelas de título de ícone diferem de outras janelas filho, no entanto, pois elas pertencem a uma janela filho MDI.

Para determinar se uma janela filho é uma janela de título de ícone, use a função GetWindow com o índice GW_OWNER. Janelas que não são de título retornam NULL. Observe que esse teste é insuficiente para janelas de nível superior, pois os menus e as caixas de diálogo são janelas de propriedade.

Dados da janela filho

Como o número de janelas filho varia dependendo de quantos documentos o usuário abre, um aplicativo MDI deve ser capaz de associar dados (por exemplo, o nome do arquivo atual) a cada janela filho. Há duas maneiras de fazer isso:

  • Armazene dados de janela filho na estrutura da janela.
  • Use as propriedades da janela.

Estrutura da Janela

Quando um aplicativo MDI registra uma classe de janela, ele pode reservar espaço extra na estrutura da janela para dados de aplicativo específicos para essa classe específica de janelas. Para armazenar e recuperar dados nesse espaço extra, o aplicativo usa as funções GetWindowLong e SetWindowLong .

Para manter uma grande quantidade de dados para uma janela filho, um aplicativo pode alocar memória para uma estrutura de dados e armazenar o identificador na memória que contém a estrutura no espaço extra associado à janela filho.

Propriedades da janela

Um aplicativo MDI também pode armazenar dados por documento usando propriedades de janela. Os dados por documento são dados específicos do tipo de documento contido em uma janela filho específica. As propriedades são diferentes do espaço extra na estrutura da janela, na qual você não precisa alocar espaço extra ao registrar a classe de janela. Uma janela pode ter qualquer número de propriedades. Além disso, onde os deslocamentos são usados para acessar o espaço extra em estruturas de janela, as propriedades são referenciadas por nomes de cadeia de caracteres. Para obter mais informações sobre as propriedades da janela, consulte Propriedades da janela.