TN029: O Windows separador

Esta anotação descreve o MFC CSplitterWnd classe, que é usado para fornecer divisões de janela e gerir o redimensionamento de outras janelas de painel.

&Notanbsp;  por favor, certifique-se de ler 20 nota técnica sobre uso de identificações e intervalos válidos de ID.

Separador estilos

Um CSplitterWnd oferece suporte a dois estilos diferentes de divisão windows.

Em "separadores estáticos", os painéis são criados quando a janela de separador é criada, e a ordem e o número de painéis nunca alteram. Barras do separador são usadas para redimensionar os painéis diferentes e diferentes painéis são geralmente das classes de modo de exibição diferente. O editor de elementos gráficos do Visual C++ e o Gerenciador de arquivos do Windows são exemplos de programas que usam esse estilo de divisor. Divisor caixas não são usadas por este estilo do divisor.

Em "Separadores dinâmicos," painéis adicionais são criados e destruídos como o usuário divisões e un-divisões novo exibições. Este divisor começa com uma única exibição e caixas de divisor são fornecidas para iniciar a divisão. Se o Exibir é dividido em uma direção, um objeto de exibição adicionais é dinamicamente criado para representar o novo painel. Se o Exibir é dividido em duas direções (possível com a interface do teclado), três novos modos de exibição são criados para representar os três novos painéis. Quando a divisão estiver ativa, a caixa de divisão é desenhada como uma barra divisória entre os painéis. Mais exibir objetos são destruídos quando o usuário remove uma divisão, mas a exibição original (linha 0, coluna 0) permanece até que a janela de separador propriamente dito é destruída. O Microsoft Excel ou Microsoft Word são exemplos do estilo dinâmico divisor.

Ao criar qualquer tipo de janela de separador, você deve especificar o número máximo de linhas e colunas que gerenciará o divisor. Para um divisor estático, painéis devem ser criados para preencher todas as linhas e colunas. Para um divisor dinâmico, o primeiro painel é criado automaticamente quando o CSplitterWnd é criada.

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

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

Exemplos de divisor

Muitos dos programas de exemplo MFC usam divisor windows direta ou indiretamente. Passo 4 do Tutorial MFC Rabisco adiciona uma dinâmico janela separadora para dividir o CScribView em vários painéis. Conforme mostrado nesta etapa, adicionar que uma Novo janela de quadro do divisor é muito fácil com o recurso de adicionar classe do ClassWizard. Este exemplo é uma dinâmico janela separadora por padrão.

O MFC geral exemplo VIEWEX ilustra vários usos do estáticos separadores, incluindo como colocar um divisor em um divisor.

ClassWizard criará um novo Múltiplo documento interface (MDI) filho quadro classe de janela que contém uma janela separadora. Consulte o separador Windows no Guia do programador do Visual C++.

Terminologia usada pela implementação

Terminologia das partes de um CSplitterWnd e objetos relacionados.

CSplitterWnd:

Esta é uma janela que fornece controles de painel-divisão e barras de rolagem são compartilhadas entre Tudo painéis em uma linha ou coluna. Linhas e colunas são especificadas com números baseado em zero [isto é, o primeiro painel é linha = 0 e coluna = 0]

Painel:

Uma ja&nela de específicas do aplicativo que é gerenciada por um CSplitterWnd. Um painel é geralmente um CView-derivado objeto, mas na verdade pode ser qualquer objeto de CWnd que possui a janela filho adequado ID.nbsp;

Para fazer isso, basta passar o RU&NTIME_CLASS do seu CWnd derivado classe como você faria se você estivesse usando um CView derivado class.nbsp; Sua classe deve usar DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE — a estrutura usa dinâmico criação em tempo de execução.  Embora haja um monte de código que é específico em CSplitterWnd CView , CObject:: IsKindOf é sempre usado antes que essas ações são executadas.  Certamente, é mais fácil usar CSplitterWnd com classes CView derivado de CWnd classes derivadas.

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 de divisão:

Um pequeno controle na parte superior das barras de rolagem vertical ou à esquerda das barras de rolagem horizontal em um dinâmico CSplitterWnd. Usado para criar novas linhas ou colunas de painéis.

Interseção do divisor:

A interseção de uma barra divisória vertical e uma barra de divisão horizontal. Podem ser arrastadas para ajustar o tamanho de uma linha e coluna de painéis simultaneamente.

Barras de rolagem compartilhado

A classe CSplitterWnd também oferece suporte a barras de rolagem compartilhado. Esses controles de barra de rolagem são filhos da CSplitterWnd e são compartilhados com diferentes painéis no separador.

Por exemplo, em uma janela de coluna de 1 linha x 2, você pode especificar WS_VSCROLL ao criar o CSplitterWnd. Será criado um Controlarar 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 os dois modos. Quando os pontos de vista definir a posição da barra de rolagem, a barra de rolagem compartilhado será definida.

Observe que as barras de rolagem compartilhado são mais úteis com divisões dinâmicos ou estáticos, divisão semelhante Exibir objetos. Se você misturar vistas de diferentes tipos em um divisor, então talvez você precise escrever código especial para coordenar as suas posições de rolagem. Qualquer CView-derivada de classe que usa a barra de rolagem CWnd APIs delegateá à barra de rolagem compartilhado se ele existir. A implementação de CScrollView é um exemplo de uma classe de CView que oferece suporte compartilhada barras de rolagem. Non -CView derivado classes, classes que dependem de barras de rolagem do noncontrol ou classes que usam padrão Windows implementações (por exemplo, CEditView) não irão funcionar com o recurso de barra de rolagem compartilhado do CSplitterWnd.

Tamanhos mínimos

Para cada linha há uma altura de linha mínimo, e da mesma forma há uma largura mínima de coluna para cada coluna. Este mínimo é utilizado para decidir se o painel é a pequeno para ser mostrado em detalhe completo.

Para uma janela de separador estático, a largura de altura e a coluna inicial linha mínimo é 0. Para uma dinâmico janela separadora, a largura de altura e a coluna inicial linha mínimo são definidas pelo parâmetro sizeMin para a função de CSplitterWnd::Create.

Estes tamanhos mínimos podem ser alterados com o SetRowInfo e SetColumnInfo APIs.

Real versus ideais tamanhos

O layout dos painéis na janela separadora depende do tamanho do quadro que contém (que por sua vez redimensiona o CSplitterWnd. CSplitterWnd reposiciona e redimensiona os painéis para que eles se encaixam como idealmente possível).

As linha altura e a coluna largura tamanhos definidos pelo usuário, ou através de CSplitterWnd API, representam o tamanho ideal. O tamanho real pode ser menor que o tamanho ideal (se não houver espaço suficiente para fazer esse painel o tamanho ideal) ou maior que o tamanho ideal (se esse painel deve ser feito maior para preencher o espaço esquerda-acima à direita ou inferior da janela do divisor).

Interface protegida

A seguir descreve alguns dos overridables de implementação de janela separadora que pode ser usado por usuários avançados de CSplitterWnd para personalizar os recursos e interface de usuário desta classe. Essas APIs são oficialmente em situação irregular e estão sujeitos a alterações em versões futuras do MFC. Por favor, consulte o código-fonte para obter mais detalhes sobre essas APIs de implementação implementação.

Desenhar as barras divisórias, caixas e rastreadores:

 e&num ESplitType nbsp;  {splitBox, splitBar, splitIntersection, splitBorder};
virtual void OnDrawSplitter (CDC * pDC, nType ESplitType, const CRect e rect);
virtual void OnInvertTracker (const CRect e rect)

Estas função virtual pode ser substituído para fornecer imagery alternativo para os vários componentes gráficos de uma janela separadora. As imagens padrão são semelhante do divisor no Microsoft Works para Windows: apenas interseções de barras divisórias são misturadas. As imagens também é bem diferente quando o framework detecta Windows 4.0-- para corresponder os visuals no shell nesse sistema operacional (futuro).

Criação de controles e modos de exibição:

virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID)

Isto é chamado para criar um controle de barra de rolagem compartilhado. Ele pode ser substituído para incluir controles extras junto a uma barra de rolagem. O comportamento padrão é para apenas criar controles de barra de rolagem Windows normais.

virtual void DeleteView (int row, int col);
virtual BOOL SplitRow(int cyBefore);
virtual BOOL SplitColumn(int cxBefore);
virtual void DeleteRow (int linha);
virtual void DeleteColumn (int linha)

Essas funções são chamadas para implementar a lógica da janela separadora dinâmica (isto é, se a janela de separador tem o estilo de SPLS_DYNAMIC_SPLIT ). Eles podem ser personalizados, juntamente com a função virtual CreateView, para implementar os divisores dinâmicos mais avançados.

A seguir estão os comandos de alto nível que são usados pela classe CView para delegate para a implementação de CSplitterWnd . Eles são virtuais para que a implementação padrão CView não exigirão a implementação de CSplitterWnd inteira para ser vinculado em. Para aplicativos que usam CView mas não CSplitterWnd, a implementação de CSplitterWnd não será vinculada com o aplicativo.

virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

Verifica se o "Pane Next" or "Pane Previous" comando é actualmente possível.

virtual void ActivateNext (BOOL bPrev = FALSE);

Executa o comando "Pane Next" or "Pane Previous".

virtual BOOL DoKeyboardSplit();

Executa o teclado dividir comando, normalmente "Dividir janela".

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index