Partilhar via


Sobre a interface de vários documentos

Cada documento numa aplicação de interface de documentos múltiplos (MDI) é exibido numa janela filha separada dentro da área cliente da janela principal da aplicação. Os aplicativos MDI típicos incluem aplicativos de processamento de texto que permitem ao usuário trabalhar com vários documentos de texto e aplicativos de planilha que permitem ao usuário trabalhar com vários gráficos e planilhas. Para obter mais informações, consulte os tópicos a seguir.

Janelas de quadro, cliente e filho

Um aplicativo MDI tem três tipos de janelas: uma janela de quadro, uma janela de cliente MDI, bem como um número de janelas filhas. A janela de quadro é como a janela principal da aplicação: tem uma borda de dimensionamento, uma barra de título, um menu de janela, um botão de minimizar e um botão de maximizar. O aplicativo deve registrar uma classe de janela para a janela de quadro e fornecer um procedimento de janela para suportá-la.

Uma aplicação MDI não exibe a saída na área cliente da janela do quadro. Em vez disso, ele exibe a janela do cliente MDI. Uma subjanela cliente MDI é um tipo especial de janela filha pertencente à classe de janelas pré-registrada MDICLIENT. A janela cliente é filha da janela do quadro; ela serve como plano de fundo para janelas filhas. Ele também fornece suporte para a criação e manipulação de subjanelas. Por exemplo, uma aplicação MDI pode criar, ativar ou maximizar janelas subordinadas 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 filhas do MDI no aplicativo. Cada janela filha tem uma borda redimensionável, uma barra de título, um menu da janela, um botão de minimizar e um botão de maximizar. Uma vez que uma janela filha é recortada, ela fica confinada à janela principal e não pode ser exibida fora dela.

Um aplicativo MDI pode suportar 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 que a aplicação suporta, uma aplicação MDI deve registar uma classe de janela secundária 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 Window Procedures.

A seguir está um aplicativo MDI típico. Chama-se Multipad.

Captura de tela de uma janela de quadro de aplicativo multipad mdi e janela do cliente.

Criação de Janela Infantil

Para criar uma janela filho, uma aplicação MDI chama a funçãoCreateMDIWindow 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 o estilo WS_EX_MDICHILD estendido.

Para destruir uma janela filha, uma aplicação MDI envia uma mensagem WM_MDIDESTROY para a janela do cliente MDI.

Ativação da janela secundária

Um número qualquer de janelas filho pode aparecer na janela cliente num dado momento, mas apenas uma pode estar ativa. A janela infantil ativa é posicionada na frente de todas as outras janelas infantis e sua borda é realçada.

O utilizador pode ativar uma janela secundária inativa clicando nela. Uma aplicação MDI ativa uma janela filha 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 filha a ser ativada e para o procedimento de janela da janela filha que está sendo desativada.

Para impedir que uma janela filha seja ativada, manipule a mensagem WM_NCACTIVATE na janela filha, retornando FALSE.

O sistema controla a posição de cada janela filha na pilha de janelas sobrepostas. Este empilhamento é conhecido como Z-Order. O utilizador pode ativar a próxima janela secundária na ordem Z ao clicar em Next no menu da janela da janela ativa. Uma aplicação ativa a próxima (ou anterior) janela filha na ordem Z ao enviar 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 menu com um menu de janela. O menu da janela deve incluir itens que organizam as janelas subordinadas dentro da janela principal ou que fecham todas as janelas subordinadas. O menu de janela de um aplicativo MDI típico pode incluir os itens na tabela a seguir.

Item de menu Finalidade
Azulejo Organiza janelas filhas em formato em mosaico para que cada uma apareça em sua totalidade na janela do cliente.
Cascade Organiza janelas filho em um formato em cascata. As janelas filhas sobrepõem-se umas às outras, mas a barra de título de cada uma é 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 filhas.

Sempre que uma janela filha é 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 utilizador pode ativar a janela subordinada correspondente. Quando uma janela filha é 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 filha é criada, o sistema adiciona o item Mais Janelas 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 lista com os títulos de todas as janelas filhas MDI atualmente disponíveis. O utilizador pode ativar uma janela secundária clicando no seu título na lista.

Se o seu aplicativo MDI suportar vários tipos de janelas filhas, adapte a barra de menus para refletir as operações associadas à janela ativa. Para fazer isso, forneça menus separados para cada tipo de janela filha suportada pela aplicação. Quando um novo tipo de janela filho é ativado, o aplicativo deve enviar uma mensagem WM_MDISETMENU para a janela cliente, passando-lhe o identificador para o menu correspondente.

Quando não existe nenhuma janela filha, 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 teclas de cursor, as teclas se comportam de forma diferente do que quando o usuário está navegando pelos menus de um aplicativo típico. Numa aplicação MDI, o controlo passa do menu de janela da aplicação para o menu de janela da janela filha ativa e, em seguida, para o primeiro item na barra de menus.

Vários aceleradores de documentos

Para receber e processar chaves aceleradoras para as suas próprias janelas filhas, uma aplicação MDI deve incluir a função TranslateMDISysAccel no seu ciclo de mensagens. O loop deve chamar TranslateMDISysAccel antes de chamar oTranslateAccelerator ou função de DispatchMessage.

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

Tamanho e disposição da janela da criança

Um aplicativo MDI controla o tamanho e a posição de suas janelas filhas enviando mensagens para a janela do cliente MDI. Para maximizar a janela filha ativa, o aplicativo envia a mensagem WM_MDIMAXIMIZE à janela cliente. Quando uma janela filha é maximizada, a 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 do 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 (pré-maximizados) enviando à janela do cliente uma mensagem WM_MDIRESTORE.

Um aplicativo MDI pode organizar suas janelas filhas em um formato cascata ou bloco. Quando as janelas filhas estão em cascata, elas aparecem empilhadas. 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 sejam 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 Cascade no menu da janela.

Quando as janelas filhas são organizadas em mosaico, o sistema exibe cada janela completamente, sem sobrepor 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 mosaico, 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 Tile no menu da janela.

Uma aplicação MDI deve fornecer um ícone diferente para cada tipo de janela filha que suporta. A aplicação especifica um ícone ao registrar a classe de janela filha. O sistema exibe automaticamente o ícone de uma janela filha na parte inferior da janela cliente quando esta é minimizada. Uma aplicação MDI instrui o sistema a organizar os ícones da janela filho enviando uma mensagem WM_MDIICONARRANGE à janela do cliente. Normalmente, o aplicativo envia essa mensagem quando o usuário clica Organizar ícones no menu da janela.

Título do Ícone no Windows

Como as janelas filhas MDI podem ser minimizadas, uma aplicação MDI deve evitar manipular janelas com título de ícone como se fossem janelas filhas MDI normais. As janelas de título do ícone aparecem quando o aplicativo enumera janelas filhas da janela do cliente MDI. As janelas de ícones de título diferem de outras janelas filhas, no entanto, porque são controladas por uma janela filha MDI.

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

Dados da janela filha

Como o número de janelas filho varia dependendo de quantos documentos o utilizador abre, uma aplicação MDI deve ser capaz de associar dados (por exemplo, o nome do ficheiro atual) a cada janela filho. Há duas maneiras de fazer isso:

  • Armazene os dados da janela filha na estrutura da janela.
  • Utilize 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 utiliza as funções GetWindowLong e SetWindowLong .

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

Propriedades da janela

Um aplicativo MDI também pode armazenar dados por documento usando propriedades de janela. Dados por documento são dados específicos do tipo de documento contido numa janela filha específica. As propriedades são diferentes do espaço extra na estrutura da janela, pois você não precisa alocar espaço extra ao registrar a classe da 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 nas estruturas de janela, as propriedades são referidas por nomes em formato de texto. Para obter mais informações sobre as propriedades da janela, consulte Propriedades da janela.