Compartilhar via


TN029: Splitter Windows

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

Estilos de divisor

Um CSplitterWnd dá suporte a dois estilos diferentes de janelas de divisão.

Em "divisores estáticos", a janela do divisor cria os painéis quando é criada. A ordem e o número de painéis nunca são alterados. As barras de divisão 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 do Visual C++ e o Gerenciador de Arquivos do Windows são exemplos de programas que usam esse estilo de divisor. Esse estilo de janela de divisor não usa caixas de divisão.

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

Ao criar qualquer tipo de janela de divisor, 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 ele 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 columnares

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

  • 2 linhas x 2 colunas: para dados orientados à grade ou tabela

Exemplos de divisor

Muitos dos programas de exemplo do MFC usam janelas de divisão direta ou indiretamente. O exemplo geral do MFC VIEWEX ilustra vários usos de divisores estáticos, incluindo como colocar um divisor em um divisor.

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

Terminologia usada pela implementação

Aqui está uma lista de termos específicos para janelas de divisão:

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. Especifique 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 um CSplitterWnd gerencia. Um painel geralmente é um objeto derivado da Classe CView, mas pode ser qualquer objeto CWnd que tenha a ID de janela filho apropriada.

Para usar um CWndobjeto derivado, passe a 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 a criação dinâmica em runtime. Embora haja muito código que CSplitterWnd seja específico para a CView classe, 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.

Splitter Box: um controle em uma dinâmica CSplitterWnd que você pode usar 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.

Interseção de divisor: a interseção de uma barra de divisor vertical e uma barra de divisor 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 dá suporte a 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 coluna de 1 linha x 2, você pode especificar WS_VSCROLL ao criar o CSplitterWnd. O Windows cria um controle de barra de rolagem especial 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 exibições. Quando qualquer um dos modos de exibição definir a posição da barra de rolagem, a barra de rolagem compartilhada será definida.

Observe que as barras de rolagem compartilhadas são mais úteis com objetos de exibição semelhantes. Se você misturar exibições de diferentes tipos em um divisor, talvez seja necessário escrever um código especial para coordenar suas posições de rolagem. Qualquer CViewclasse derivada que usa as APIs da CWnd barra de rolagem delegará à barra de rolagem compartilhada se existir. A CScrollView implementação é um exemplo de uma CView classe que dá suporte a barras de rolagem compartilhadas. Classes que não são derivadas de CViewclasses 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 de 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. Esse mínimo garante que um painel não seja muito pequeno para ser mostrado em detalhes completos.

Para uma janela de divisor estático, a altura mínima inicial da linha e a largura da coluna é 0. Para uma janela de divisor dinâmico, 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 versus ideais

O layout dos painéis na janela do divisor depende do tamanho do quadro que os contém. Quando um usuário redimensiona o quadro que contém, os CSplitterWnd repositórios e redimensiona os painéis para que eles se ajustem da melhor maneira possível.

O usuário pode definir manualmente os tamanhos de altura e largura da coluna da linha ou o programa pode definir o tamanho ideal usando a CSplitterWnd classe. O tamanho real pode ser menor ou maior 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. Você pode substituir este primeiro conjunto para fornecer imagens alternativas para os vários componentes gráficos de uma janela de divisor.

  • 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 compartilhada. Você pode substituí-lo para criar controles extras ao lado da barra de rolagem.

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

Essas funções implementam a lógica da janela de divisor dinâmico. Você pode substituí-los para fornecer uma lógica de divisor 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 do CView

A CView classe usa os comandos de alto nível a seguir para delegar à CSplitterWnd implementação. Como esses comandos são virtuais, a implementação padrão CView não exigirá que toda CSplitterWnd a implementação seja 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 atualmente é possível.

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    Executa o comando "Próximo Painel" ou "Painel Anterior".

  • virtual BOOL DoKeyboardSplit();

    Executa o comando de divisão de teclado, geralmente "Divisão de Janela".

Consulte também

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