Compartilhar via


Sobre a Interface de Múltiplos Documentos

Cada documento em um aplicativo MDI (interface de múltiplos documentos) é exibido em uma janela filha separada dentro da área cliente da janela principal 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-quadro, uma janela de cliente MDI, bem como várias janelas-filho. A janela de quadro é como a janela principal 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 moldura e fornecer um procedimento de janela para dar suporte a ela.

Um aplicativo MDI não exibe a saída na área cliente da janela de moldura. Em vez disso, ele exibe a janela do cliente MDI. Uma janela do cliente MDI é um tipo especial de janela filha pertencente à classe de janela pré-registrada MDICLIENT. A janela do cliente é um subcomponente da janela de moldura; ela serve como o plano de fundo para janelas filhas. Também oferece suporte para criar e manipular subjanelas. Por exemplo, um aplicativo MDI pode criar, ativar ou maximizar janelas filhas ao enviar mensagens para a janela cliente MDI.

Quando o usuário abre ou cria um documento, a janela do cliente cria uma janela filho para o documento. A janela cliente é a janela pai de todas as janelas filhas MDI no aplicativo. Cada janela filha 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. Como uma janela filho está 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 que suporta, um aplicativo MDI deve registrar uma classe de janela filha e fornecer uma função de janela para dar suporte às janelas que pertencem 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.

Veja a seguir um aplicativo MDI típico. Ele se chama Multipad.

Captura de tela de uma janela de quadro de aplicativo MDI multipad e da 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 filha MDI é chamar a função CreateWindowEx, especificando o estilo estendido WS_EX_MDICHILD.

Para destruir uma janela filha, 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 cliente a qualquer momento, 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 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 que 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 para a janela filha retornando o valor FALSE.

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

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

Vários menus de documento

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 arrumem as subjanelas dentro da janela do cliente ou que fechem todas as subjanelas. O menu de janela de um aplicativo MDI típico pode incluir os itens na tabela a seguir.

Item de menu Propósito
Telha Organiza janelas filhas em um formato em mosaico 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 está visível.
Organizar ícones Organiza os ícones das janelas filho minimizadas na parte inferior da janela principal do cliente.
Fechar Tudo Fecha todas as janelas filho.

Sempre que uma janela filha é criada, o sistema anexa 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. Clicando no item de menu, o usuário pode ativar a janela filha 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 listagem com os títulos de todas as subjanelas MDI disponíveis no momento. O usuário pode ativar uma janela secundária clicando em seu título na caixa de lista.

Se o aplicativo MDI der suporte a vários tipos de janelas filhas, 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 filha que o aplicativo suporta. 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 não houver 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 chaves de cursor, as chaves se comportam de forma diferente do que quando o usuário está navegando pelos menus típicos de um aplicativo. Em um aplicativo MDI, o controle passa do menu da janela do aplicativo para o menu da janela filha ativa e, em seguida, para o primeiro item da 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 de uma janela filha MDI são diferentes daquelas para uma janela filha não MDI. Em uma janela filha do MDI, ALT+ – (menos) abre o menu da janela, CTRL+F4 fecha a janela filha ativa, e CTRL+F6 ativa a próxima janela filha.

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 filha ativa, o aplicativo envia a mensagem WM_MDIMAXIMIZE para a janela do cliente. Quando uma janela filha é maximizada, sua área de cliente preenche completamente a janela cliente do 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 (pré-maxizados), enviando à janela do cliente uma mensagem WM_MDIRESTORE .

Um aplicativo MDI pode organizar suas janelas filhas em um formato em cascata ou em mosaico. Quando as janelas filhas estão 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 em formato 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 filhas são organizadas lado a lado, o sistema exibe cada janela filha em sua totalidade, sem sobrepor nenhuma das janelas. Todas as janelas são dimensionadas, conforme necessário, para caber dentro da janela do cliente. Para organizar janelas filhas no formato de bloco, um aplicativo MDI envia uma mensagem WM_MDITILE para a janela cliente. Normalmente, o aplicativo envia essa mensagem quando o usuário clica em Organizar no menu da janela.

Um aplicativo MDI deve fornecer um ícone diferente para cada tipo de janela filho que suporte. O aplicativo 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 do cliente quando a janela filha é minimizada. Um aplicativo MDI direciona o sistema a organizar os ícones das subjanelas 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.

Título do Ícone Windows

Como as janelas filho do MDI podem ser minimizadas, um aplicativo MDI deve evitar manipular as janelas de título de ícones como se fossem janelas filho MDI normais. Janelas de título de ícones são exibidas quando o aplicativo enumera janelas filhas da janela do cliente MDI. Os títulos das janelas de ícone diferem de outras janelas filhas, no entanto, porque são de propriedade de uma janela filha do MDI.

Para determinar se uma subjanela é 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 filha

Como o número de janelas filhas 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 filha. Há duas maneiras de fazer isso:

  • Armazene os dados da janela filha na estrutura da janela.
  • Use as propriedades da janela.

Estrutura de 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 filial, um aplicativo pode alocar memória para uma estrutura de dados e então armazenar o identificador da memória que contém a estrutura no espaço extra associado à janela filial.

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 para o tipo de documento contido em uma janela filho 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 de janela. Uma janela pode ter qualquer número de propriedades. Além disso, quando offsets são usados para acessar o espaço extra em estruturas de janela, as propriedades são referenciadas por nomes de strings. Para obter mais informações sobre as propriedades da janela, consulte Propriedades da Janela.