TN029: Ventanas divisoras

Esta nota describe la clase MFC CSplitterWnd , que se utiliza para proporcionar ventana divisiones y para administrar el tamaño de las demás ventanas de panel.

&Notanbsp;  por favor asegúrese de leer 20 de nota técnica sobre uso de identificaciones y rangos válidos de ID.

Estilos de separador

Un CSplitterWnd admite dos estilos diferentes de la División windows.

En "separadores estáticos", los paneles se crean cuando se crea la ventana divisora, y nunca cambiarán el orden y el número de paneles. Barras de separador se utilizan para cambiar el tamaño de los distintos paneles, y los distintos paneles suelen ser de clases de vista diferentes. El editor de gráficos de Visual C++ y el administrador de archivos de Windows son ejemplos de programas que utilizan este estilo de separador. Cuadros de separador no son utilizados por este estilo de splitter.

En "Separadores dinámicos," paneles adicionales se crean y destruidas como las vistas nuevas usuario divisiones y divisiones de las Naciones Unidas. Este separador se inicia con una vista única y cuadros de separador se proporcionan para iniciar la separación. Si la vista está dividida en una dirección, se crea dinámicamente un objeto de vista adicionales para representar el nuevo panel. Si la vista está dividida en dos direcciones (posible con la interfaz de teclado), se crean tres nuevos puntos de vista para representar los tres paneles nuevos. Cuando la División está activa, el cuadro separador se dibuja como una barra de separación entre los paneles. Adicional ver objetos son destruidos cuando el usuario elimina una división, pero la vista original (fila 0, columna 0) sigue siendo hasta la ventana del separador es destruida. Microsoft Excel o Microsoft Word son ejemplos del estilo separador dinámico.

Al crear cualquier tipo de ventana divisora, debe especificar el número máximo de filas y columnas que va a gestionar el separador. Para un separador estático, paneles deben crearse para llenar todas las filas y columnas. Para un separador dinámico, el primer panel se crea automáticamente cuando se crea el CSplitterWnd.

El número máximo de paneles que puede especificar para los separadores estáticos es 16 filas por 16 columnas. Son las configuraciones recomendadas:

El número máximo de paneles que puede especificar para los separadores dinámicos es 2 filas por 2 columnas. Son las configuraciones recomendadas:

Ejemplos de separador

Muchos de los programas de ejemplo MFC utilizan ventanas divisoras directa o indirectamente. Paso 4 del Tutorial de MFC GARABATO agrega una ventana separador dinámico para el CScribView se dividió en varios paneles. Como se muestra en este paso, agregando que una nueva ventana de marco separador es muy fácil con la característica de Agregar clase de ClassWizard. Este ejemplo es una ventana separador dinámico por defecto.

El ejemplo General de MFC VIEWEX ilustra varios usos de separadores estáticos, incluyendo cómo colocar un separador en un separador.

ClassWizard también creará un nuevo múltiples MDI (interfaz) niño marco ventana clase de documento que contiene una ventana divisora. Consulte ventanas divisoras en Guía del programador de Visual C++.

Terminología utilizada por la aplicación

Terminología de las partes de un CSplitterWnd y objetos relacionados.

CSplitterWnd:

Esta es una ventana que proporciona controles de panel de separación y barras de desplazamiento que se comparten entre todos los paneles en una fila o columna. Filas y columnas se especifican con números cero [es decir, el primer panel es fila = 0 y columna = 0]

Panel:

U&na ventana específica de la aplicación que está gestionada por un CSplitterWnd. Un panel es usualmente un CView-objeto derivado, pero en realidad puede ser cualquier objeto CWnd que tiene la ventana secundaria adecuada ID.nbsp;

Para hacerlo, simplemente pasar la RU&NTIME_CLASS de su CWnd clase derivada como lo haría si estuviera utilizando un class.nbsp de CView derivados; Debe utilizar la clase DECLARE_DYNCREATE y IMPLEMENT_DYNCREATE --el marco utiliza creación dinámica en tiempo de ejecución.  Aunque hay un montón de código CView específicas en CSplitterWnd, CObject::IsKindOf se utiliza siempre antes de realizar esas acciones.  Sin duda, es mucho más fácil utilizar CSplitterWnd con clases de CView derivado de las clases derivadas de CWnd.

Barra divisora:

Un control que se coloca entre filas y columnas de paneles. Puede utilizarse para ajustar el tamaño de filas o columnas de paneles.

Cuadro de separador:

Un pequeño control en la parte superior de las barras de desplazamiento vertical o a la izquierda de las barras de desplazamiento horizontal en una dinámica CSplitterWnd. Utilizado para crear nuevas filas o columnas de paneles.

Intersección de separador:

La intersección de una barra divisora vertical y una barra de división horizontal. Puede arrastrar para ajustar el tamaño de una fila y columna de paneles simultáneamente.

Barras de desplazamiento compartido

La clase CSplitterWnd también admite barras de desplazamiento compartido. Estos controles de la barra de desplazamiento son hijos de la CSplitterWnd y se comparten con los distintos paneles en el separador.

Por ejemplo, en una ventana de columna 1 fila 2 x, puede especificar WS_VSCROLL al crear el CSplitterWnd. Se crea un control de barra de desplazamiento especial que es compartido entre los dos paneles.

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

Cuando el usuario mueve la barra de desplazamiento, se enviarán mensajes WM_VSCROLL a ambas vistas. Cuando las vistas establece la posición de la barra de desplazamiento, se establecerá en la barra de desplazamiento compartido.

Tenga en cuenta que las barras de desplazamiento compartidos son más útiles con divisiones dinámicos o estáticos, División de objetos de vista similares. Si mezcla opiniones de diferentes tipos en un separador, puede tener que escribir código especial para coordinar sus posiciones de desplazamiento. Cualquier CView-derivado de la clase que utiliza la barra de desplazamiento de CWnd APIs delegará a la barra de desplazamiento compartido si existe. La aplicación de CScrollView es un ejemplo de una clase de CView que admite compartida barras de desplazamiento. No -CView derivar clases, clases que dependen de las barras de desplazamiento transmite o clases que utilizan Windows estándar implementaciones (por ejemplo, CEditView) no funcionará con la función de barra de desplazamiento compartida de CSplitterWnd.

Tallas mínimas

Para cada fila hay una altura mínima de fila, y asimismo para cada columna es una anchura mínima de columna. Este mínimo se utiliza para decidir si el panel está al pequeño que se muestra en detalle completo.

Para una ventana divisora estática, el ancho de columna y alto de fila mínimo inicial es 0. Para una ventana separador dinámico, se establecen el ancho de columna y alto de fila mínimo inicial por el parámetro sizeMin a la función CSplitterWnd:: Create.

Estos tamaños mínimos pueden cambiarse con el SetRowInfo y SetColumnInfo API.

Real vs tamaños ideales

El diseño de los paneles en la ventana divisora depende del tamaño del fotograma que contiene (que a su vez cambia el tamaño de la CSplitterWnd. CSplitterWnd reposiciona y cambia el tamaño de los paneles para que encajan idealmente posible).

Los fila altura columna ancho tamaños y establecido por el usuario, o a través de la CSplitterWnd API, representan el tamaño ideal. El tamaño real puede ser menor de ese tamaño ideal (si no hay espacio suficiente para que ese panel de tamaño ideal) o mayor que el tamaño ideal (si ese panel debe hacerse más para llenar el espacio de sobras en el derecho o inferior de la ventana divisora).

Interfaz protegida

A continuación describen algunos de los reemplazables de aplicación de ventana separador que pueden utilizarse por usuarios avanzados de CSplitterWnd para personalizar las características y la interfaz de usuario de esta clase. Estas API son oficialmente indocumentadas y están sujetos a cambios en futuras versiones de MFC. Consulte el código fuente de aplicación para obtener más detalles sobre estos aplicación API.

Los bares de separador, cuadros y rastreadores de dibujo:

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

Estas funciones virtuales se pueden reemplazar para proporcionar imágenes alternativas para los diversos componentes gráficos de una ventana divisora. Las imágenes por defecto son similar para el separador en Microsoft Works para Windows: sólo intersecciones de barras separador están fusionadas. Las imágenes también son muy diferente cuando el marco detecta Windows 4.0--a fin de coincidir con las imágenes en el shell en ese sistema operativo (futuro).

Creación de controles y vistas:

virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID)

Esto se llama crear un control de barra de desplazamiento compartido. Puede reemplazarse para incluir controles adicionales junto a una barra de desplazamiento. El comportamiento predeterminado es sólo crear controles de barra de desplazamiento de Windows normales.

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

Estas funciones están llamadas a implementar la lógica de la ventana separador dinámico (es decir, si la ventana divisora tiene el estilo SPLS_DYNAMIC_SPLIT ). Ellos pueden personalizarse, junto con la función virtual CreateView, implementar separadores dinámicos más avanzados.

Los siguientes son comandos de alto niveles que son utilizados por la clase CView para delegar a la aplicación de CSplitterWnd . Son virtuales para que la implementación de CView estándar no requerirá la implementación completa de CSplitterWnd para vincularse en. Para aplicaciones que utilizan CView pero no CSplitterWnd, la aplicación de CSplitterWnd no se vincularán con la aplicación.

virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

Comprueba si el comando "Siguiente panel" o "anterior" es actualmente posible.

virtual void ActivateNext (BOOL bPrev = FALSE);

Ejecuta el comando "Siguiente panel" o "anterior".

virtual BOOL DoKeyboardSplit();

Realiza el teclado dividir comando, generalmente "ventana Split".

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index