Compartir a través de


TN029: Ventanas divisoras

En esta nota se describe la clase CSplitterWnd de MFC, que proporciona divisiones de ventana y administra el cambio de tamaño de otras ventanas de panel.

Estilos de divisor

Un CSplitterWnd admite dos estilos diferentes de ventanas de división.

En "divisores estáticos", la ventana divisora crea los paneles cuando se crea. El orden y el número de paneles nunca cambian. Las barras divisoras se usan para cambiar el tamaño de los distintos paneles. Puede usar este estilo para mostrar una clase de vista diferente en cada panel. El editor de gráficos de Visual C++ y el Administrador de archivos de Windows son ejemplos de programas que usan este estilo divisor. Este estilo de ventana divisora no usa cuadros divisores.

En "divisores dinámicos", se crean y destruyen paneles adicionales a medida que el usuario divide y desa divide nuevas vistas. Este divisor comienza con una sola vista y proporciona cuadros divisores para que el usuario inicie la división. La ventana divisora crea dinámicamente un nuevo objeto de vista cuando la vista se divide en una dirección. Este nuevo objeto de vista representa el nuevo panel. Si la vista se divide en dos direcciones mediante la interfaz de teclado, la ventana divisora crea tres nuevos objetos de vista para los tres paneles nuevos. Mientras la división está activa, Windows muestra el cuadro divisor como una barra divisora entre los paneles. Windows destruye objetos de vista adicionales cuando el usuario quita una división, pero la vista original permanece hasta que se destruye la propia ventana divisora. Microsoft Excel y Microsoft Word son ejemplos de aplicaciones que usan el estilo de divisor dinámico.

Al crear cualquier tipo de ventana divisora, debe especificar el número máximo de filas y columnas que administrará el divisor. Un divisor estático creará paneles para rellenar todas las filas y columnas. Un divisor dinámico creará solo el primer panel cuando CSplitterWnd se cree .

El número máximo de paneles que puede especificar para los divisores estáticos es de 16 filas en 16 columnas. Las configuraciones recomendadas son:

  • 1 fila x 2 columnas: normalmente con paneles diferentes

  • 2 filas x 1 columna: normalmente con paneles diferentes

  • 2 filas x 2 columnas: normalmente con paneles similares

El número máximo de paneles que puede especificar para divisores dinámicos es de 2 filas por 2 columnas. Las configuraciones recomendadas son:

  • 1 fila x 2 columnas: para datos en columnas

  • 2 filas x 1 columna: para texto u otros datos

  • 2 filas x 2 columnas: para datos orientados a cuadrículas o tablas

Ejemplos de divisores

Muchos de los programas de ejemplo de MFC usan ventanas divisoras directas o indirectamente. En el ejemplo general de MFC VIEWEX se muestran varios usos de divisores estáticos, incluido cómo colocar un divisor en un divisor.

También puede usar ClassWizard para crear una nueva clase de ventana de marco secundario de interfaz de documento (MDI) que contenga una ventana divisora. Para obtener más información sobre las ventanas divisoras, vea Varios tipos de documentos, vistas y ventanas de marco.

Terminología usada por la implementación

Esta es una lista de términos específicos de las ventanas divisoras:

CSplitterWnd: ventana que proporciona controles de división de panel y barras de desplazamiento que se comparten entre todos los paneles de una fila o columna. Especifique filas y columnas con números de base cero (el primer panel es fila = 0 y columna = 0).

Panel: una ventana específica de la aplicación que administra.CSplitterWnd Un panel suele ser un objeto derivado de la clase CView, pero puede ser cualquier objeto CWnd que tenga el identificador de ventana secundario adecuado.

Para usar un CWndobjeto derivado de , pase el RUNTIME_CLASS del objeto a la CreateView función como lo haría si estuviera usando una CViewclase derivada de . La clase debe usar DECLARE_DYNCREATE y IMPLEMENT_DYNCREATE porque el marco usa la creación dinámica en tiempo de ejecución. Aunque hay un montón de código en CSplitterWnd que es específico de la CView clase , CObject::IsKindOf siempre se usa antes de que se realicen esas acciones.

Barra divisora: control que se coloca entre filas y columnas de paneles. Se puede usar para ajustar los tamaños de las filas o columnas de paneles.

Splitter Box: un control en una dinámica CSplitterWnd que puede usar para crear nuevas filas o columnas de paneles. Se encuentra en la parte superior de las barras de desplazamiento verticales o a la izquierda de las barras de desplazamiento horizontales.

Intersección de divisor: intersección de una barra divisora vertical y una barra divisora horizontal. Puede arrastrarlo para ajustar el tamaño de una fila y una columna de paneles simultáneamente.

Barras de desplazamiento compartidas

La CSplitterWnd clase también admite barras de desplazamiento compartidas. Estos controles de barra de desplazamiento son elementos secundarios de CSplitterWnd y se comparten con los diferentes paneles del divisor.

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

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

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

Tenga en cuenta que las barras de desplazamiento compartidas son más útiles con objetos de vista similares. Si combina vistas de diferentes tipos en un divisor, es posible que tenga que escribir código especial para coordinar sus posiciones de desplazamiento. Cualquier CViewclase derivada de que use las API de barra CWnd de desplazamiento delegará en la barra de desplazamiento compartida si existe. La CScrollView implementación es un ejemplo de una CView clase que admite barras de desplazamiento compartidas. Las clases que no se derivan de CView, clases que se basan en barras de desplazamiento que no son de control o clases que usan implementaciones estándar de Windows (por ejemplo, CEditView) no funcionarán con la característica de barra de desplazamiento compartida de CSplitterWnd.

Tamaños mínimos

Para cada fila hay un alto mínimo de fila y para cada columna hay un ancho de columna mínimo. Este mínimo garantiza que un panel no sea demasiado pequeño para mostrarse con detalle completo.

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

Puede cambiar estos tamaños mínimos mediante las funciones CSplitterWnd::SetRowInfo y CSplitterWnd::SetColumnInfo .

Tamaños reales frente a ideales

El diseño de los paneles de la ventana divisora depende del tamaño del marco que los contiene. Cuando un usuario cambia el tamaño del marco contenedor, cambia la posición y cambia el CSplitterWnd tamaño de los paneles para que se ajusten al máximo posible.

El usuario puede establecer manualmente los tamaños de alto de fila y ancho de columna, o bien el programa puede establecer el tamaño ideal mediante la CSplitterWnd clase . El tamaño real puede ser menor o mayor que el ideal. Windows ajustará el tamaño real si no hay suficiente espacio para mostrar el tamaño ideal o si hay demasiado espacio vacío en la parte derecha o inferior de la ventana divisora.

Controles personalizados

Puede invalidar muchas funciones para proporcionar un comportamiento personalizado y una interfaz personalizada. Puede invalidar este primer conjunto para proporcionar imágenes alternativas para los distintos componentes gráficos de una ventana divisora.

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

  • virtual void OnInvertTracker(const CRect& rect);

Llame a esta función para crear un control de barra de desplazamiento compartido. Puede invalidarlo para crear controles adicionales junto a la barra de desplazamiento.

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

Estas funciones implementan la lógica de la ventana divisora dinámica. Puede invalidarlas para proporcionar lógica de divisor más avanzada.

  • 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);

Funcionalidad de CView

La CView clase usa los siguientes comandos de alto nivel para delegar en la CSplitterWnd implementación. Dado que estos comandos son virtuales, la implementación estándar CView no requerirá que toda CSplitterWnd la implementación esté vinculada. En el caso de las aplicaciones que usan CView , pero no CSplitterWnd, la CSplitterWnd implementación no se vinculará con la aplicación.

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

    Comprueba si actualmente es posible ID_NEXT_PANE o ID_PREV_PANE.

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    Ejecuta el comando "Panel siguiente" o "Panel anterior".

  • virtual BOOL DoKeyboardSplit();

    Ejecuta el comando de división de teclado, normalmente "División de ventana".

Consulte también

Notas técnicas por número
Notas Técnicas por Categoría