Partilhar via


TN029: Janelas divisórias

Esta nota descreve a classe MFC CSplitterWnd, que fornece divisões de janela e gerencia o redimensionamento de outras janelas de painel.

Estilos do separador

A CSplitterWnd suporta dois estilos diferentes de dividir janelas.

Em "divisores estáticos", a janela divisora cria os painéis no momento em que é criada. A ordem e o número de painéis nunca são alterados. As barras divisórias são usadas para redimensionar os diferentes painéis. Você pode usar esse estilo para exibir uma classe de exibição diferente em cada painel. O editor de gráficos Visual C++ e o Gerenciador de arquivos do Windows são exemplos de programas que usam esse estilo de divisor. Este estilo de janela divisória não usa caixas divisórias.

Em "divisores dinâmicos", painéis adicionais são criados e destruídos à medida que o usuário divide e desdivide novas exibições. Este divisor começa com uma única exibição e fornece caixas divisórias para que o utilizador possa iniciar a divisão. A janela divisória cria dinamicamente um novo objeto de vista quando a vista é dividida numa direção. Este novo objeto de exibição representa o novo painel. Se a vista for dividida em duas direções usando a interface de teclado, a janela de divisão criará três novos objetos de vista para os três novos painéis. Enquanto a divisão está ativa, o Windows exibe a caixa divisória como uma barra divisória entre os painéis. Windows destrói objetos de visualização adicionais quando o utilizador remove uma divisão, mas a visualização original permanece até que a própria janela do separador seja destruída. Microsoft Excel e Microsoft Word são exemplos de aplicativos que usam o estilo divisor dinâmico.

Ao criar qualquer tipo de janela de divisão, você deve especificar o número máximo de linhas e colunas que o divisor gerenciará. Um divisor estático criará painéis para preencher todas as linhas e colunas. Um divisor dinâmico criará apenas o primeiro painel quando o CSplitterWnd for criado.

O número máximo de painéis que você pode especificar para divisores estáticos é de 16 linhas por 16 colunas. As configurações recomendadas são:

  • 1 linha x 2 colunas: geralmente com painéis diferentes

  • 2 linhas x 1 coluna: geralmente com painéis diferentes

  • 2 linhas x 2 colunas: geralmente com painéis semelhantes

O número máximo de painéis que você pode especificar para divisores dinâmicos é de 2 linhas por 2 colunas. As configurações recomendadas são:

  • 1 linha x 2 colunas : para dados colunares

  • 2 linhas x 1 coluna : para dados textuais ou outros

  • 2 linhas x 2 colunas : para dados orientados para grelha ou tabela

Exemplos de divisores

Muitos dos programas de exemplo MFC usam janelas divisórias direta ou indiretamente. O exemplo geral MFC VIEWEX ilustra vários usos de separadores estáticos, incluindo como colocar um separador num separador.

Você também pode usar o ClassWizard para criar uma nova classe de janela filha de interface de documento múltiplo (MDI) que contém uma janela de separador. Para obter mais informações sobre janelas divisórias, consulte Vários tipos de documentos, modos de exibição e janelas de quadro.

Terminologia utilizada pela implementação

Aqui está uma lista de termos que são específicos para janelas divisoras:

CSplitterWnd: Uma janela que fornece controles de divisão de painel e barras de rolagem que são compartilhadas entre todos os painéis em uma linha ou coluna. Você especifica linhas e colunas com números baseados em zero (o primeiro painel é linha = 0 e coluna = 0).

Painel: uma janela específica do aplicativo que é gerida por um CSplitterWnd. Um painel é geralmente um objeto derivado da classe CView, mas pode ser qualquer objeto CWnd que tenha o ID de janela filho apropriado.

Para usar um CWndobjeto -derivado, passe o RUNTIME_CLASS do objeto para a CreateView função como faria se estivesse usando uma CViewclasse -derivada. Sua classe deve usar DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE porque a estrutura usa criação dinâmica em tempo de execução. Embora haja muito código no CSplitterWnd que é específico para a classe CView, o CObject::IsKindOf é sempre usado antes que essas ações sejam executadas.

Barra de divisão: um controle que é colocado entre linhas e colunas de painéis. Ele pode ser usado para ajustar os tamanhos de linhas ou colunas de painéis.

Caixa Divisora: Um controlo num CSplitterWnd dinâmico que pode utilizar para criar novas linhas ou colunas de painéis. Ele está localizado na parte superior das barras de rolagem verticais ou à esquerda das barras de rolagem horizontais.

Intersecção do divisor: A intersecção de uma barra divisória vertical e uma barra divisória horizontal. Você pode arrastá-lo para ajustar o tamanho de uma linha e coluna de painéis simultaneamente.

Barras de rolagem compartilhadas

A CSplitterWnd classe também suporta barras de rolagem compartilhadas. Esses controles de barra de rolagem são filhos do CSplitterWnd e são compartilhados com os diferentes painéis no divisor.

Por exemplo, em uma janela de 1 linha x 2 colunas, você pode especificar WS_VSCROLL ao criar o CSplitterWnd. O Windows cria um controle de barra de rolagem especial que é compartilhado entre os dois painéis.

[      ][      ][^]
[pane00][pane01][|]
[      ][      ][v]

Quando o usuário move a barra de rolagem, WM_VSCROLL mensagens serão enviadas para ambas as visualizações. Quando qualquer uma das vistas definir a posição da barra de deslocamento, a barra de deslocamento partilhada será definida.

Observe que as barras de rolagem compartilhadas são mais úteis com objetos de exibição semelhantes. Se misturares visualizações de diferentes tipos num separador, pode ser necessário escrever um código especial para sincronizar as suas posições de rolagem. Qualquer classe derivada CView que use as APIs das barras de rolagem CWnd irá delegar à barra de rolagem partilhada, se esta existir. A CScrollView implementação é um exemplo de uma CView classe que suporta barras de rolagem compartilhadas. Classes que não são derivadas de CView, classes que dependem de barras de rolagem sem controle ou classes que usam implementações padrão do Windows (por exemplo, CEditView) não funcionarão com o recurso de barra de rolagem compartilhada do CSplitterWnd.

Tamanhos Mínimos

Para cada linha há uma altura mínima de linha, e para cada coluna há uma largura mínima de coluna. Este mínimo garante que um painel não é demasiado pequeno para ser mostrado em pormenor.

Para uma janela de divisão estática, a altura mínima inicial da linha e a largura da coluna é 0. Para uma janela divisória dinâmica, a altura mínima inicial da linha e a largura da coluna são definidas pelo parâmetro sizeMin da CSplitterWnd::Create função.

Você pode alterar esses tamanhos mínimos usando as funções CSplitterWnd::SetRowInfo e CSplitterWnd::SetColumnInfo .

Tamanhos reais vs. ideais

A disposição dos painéis na janela do divisor depende do tamanho da moldura que os contém. Quando um usuário redimensiona o quadro que contém, o CSplitterWnd reposiciona e redimensiona os painéis para que eles se encaixem o melhor possível.

O usuário pode definir manualmente a altura da linha e os tamanhos da largura da coluna, ou o programa pode definir o tamanho ideal usando a CSplitterWnd classe. O tamanho real pode ser menor ou maior do que o ideal. O Windows ajustará o tamanho real se não houver espaço suficiente para exibir o tamanho ideal ou se houver muito espaço vazio à direita ou na parte inferior da janela do divisor.

Controles personalizados

Você pode substituir muitas funções para fornecer um comportamento personalizado e uma interface personalizada. É possível substituir esta primeira configuração para fornecer imagens alternativas para os vários componentes gráficos de uma janela de separação.

  • virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);

  • virtual void OnInvertTracker(const CRect& rect);

Você chama essa função para criar um controle de barra de rolagem compartilhado. Você pode substituí-lo para criar controles extras ao lado da barra de rolagem.

  • virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);

Estas funções implementam a lógica da janela de divisão dinâmica. Você pode substituí-los para fornecer uma lógica de divisão mais avançada.

  • virtual void DeleteView(int row, int col);

  • virtual BOOL SplitRow(int cyBefore);

  • virtual BOOL SplitColumn(int cxBefore);

  • virtual void DeleteRow(int rowDelete);

  • virtual void DeleteColumn(int colDelete);

Funcionalidade CView

A CView classe usa os seguintes comandos de alto nível para delegar à CSplitterWnd implementação. Como esses comandos são virtuais, a implementação padrão CView não exigirá que a implementação completa CSplitterWnd esteja vinculada. Para aplicativos que usam CView , mas não CSplitterWnd, a CSplitterWnd implementação não será vinculada ao aplicativo.

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

    Verifica se ID_NEXT_PANE ou ID_PREV_PANE é possível no momento.

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    Executa o comando "Painel Seguinte" ou "Painel Anterior".

  • virtual BOOL DoKeyboardSplit();

    Executa o comando de divisão do teclado, geralmente denominado "Window Split".

Ver também

Notas técnicas por número
Notas técnicas por categoria