Compartir a través de


Clase CScrollView

Elemento CView con funcionalidades de desplazamiento.

Sintaxis

class CScrollView : public CView

Miembros

Constructores protegidos

Nombre Descripción
CScrollView::CScrollView Construye un objeto CScrollView.

Métodos públicos

Nombre Descripción
CScrollView::CheckScrollBars Indica si la vista de desplazamiento tiene barras de desplazamiento horizontales y verticales.
CScrollView::FillOutsideRect Rellena el área de una vista fuera del área de desplazamiento.
CScrollView::GetDeviceScrollPosition Obtiene la posición de desplazamiento actual en unidades de dispositivo.
CScrollView::GetDeviceScrollSizes Obtiene el modo de asignación actual, el tamaño total y los tamaños de línea y página de la vista desplazable. Los tamaños están en unidades de dispositivo.
CScrollView::GetScrollPosition Obtiene la posición de desplazamiento actual en unidades lógicas.
CScrollView::GetTotalSize Obtiene el tamaño total de la vista de desplazamiento en unidades lógicas.
CScrollView::ResizeParentToFit Hace que el tamaño de la vista determine el tamaño de su marco.
CScrollView::ScrollToPosition Desplaza la vista a un punto determinado, especificado en unidades lógicas.
CScrollView::SetScaleToFitSize Coloca la vista de desplazamiento en modo de escalado hasta el ajuste.
CScrollView::SetScrollSizes Establece el modo de asignación de la vista de desplazamiento, el tamaño total y las cantidades de desplazamiento horizontal y vertical.

Comentarios

Puede controlar el desplazamiento estándar en cualquier clase derivada de CView invalidando las funciones miembro OnHScroll y OnVScroll asignadas al mensaje. Sin embargo, CScrollView agrega las siguientes características a sus funcionalidades de CView:

  • Administra los tamaños de la ventana y la ventanilla, y los modos de asignación.

  • Se desplaza automáticamente en respuesta a los mensajes de la barra de desplazamiento.

  • Se desplaza automáticamente en respuesta a los mensajes del teclado, un mouse sin desplazamiento o la rueda IntelliMouse.

Para desplazarse automáticamente en respuesta a los mensajes del teclado, agregue un mensaje WM_KEYDOWN, pruebe para VK_DOWN y VK_PREV, y llame a SetScrollPos.

Puede controlar el desplazamiento de la rueda del mouse invalidando las funciones miembro OnMouseWheel y OnRegisteredMouseWheel asignadas al mensaje. Como son para CScrollView, estas funciones miembro admiten el comportamiento recomendado para WM_MOUSEWHEEL, el mensaje de rotación de la rueda.

Para aprovechar las ventajas del desplazamiento automático, derive la clase de la vista de CScrollView en lugar de CView. Cuando se crea la vista por primera vez, si desea calcular el tamaño de la vista desplazable en función del tamaño del documento, llame a la función miembro SetScrollSizes desde la invalidación de CView::OnInitialUpdate o CView::OnUpdate. (Debe escribir su propio código para consultar el tamaño del documento. Para obtener un ejemplo, consulte el ejemplo de Scribble).

La llamada a la función miembro SetScrollSizes establece el modo de asignación de la vista, las dimensiones totales de la vista de desplazamiento y las cantidades para desplazarse horizontal y verticalmente. Todos los tamaños están en unidades lógicas. El tamaño lógico de la vista se calcula normalmente a partir de los datos almacenados en el documento, pero en algunos casos es posible que desee especificar un tamaño fijo. Para ver ejemplos de ambos enfoques, consulte CScrollView::SetScrollSizes.

Especifique las cantidades para desplazarse horizontal y verticalmente en unidades lógicas. De manera predeterminada, si el usuario hace clic en el eje de una barra de desplazamiento fuera del cuadro de desplazamiento, CScrollView desplaza una "página". Si el usuario hace clic en una flecha de desplazamiento al final de una barra de desplazamiento, CScrollView desplaza una "línea". De manera predeterminada, una página es 1/10 del tamaño total de la vista y una línea es 1/10 del tamaño de la página. Invalide estos valores predeterminados pasando tamaños personalizados en la función miembro SetScrollSizes. Por ejemplo, puede establecer el tamaño horizontal en alguna fracción del ancho del tamaño total y el tamaño vertical en el alto de una línea en la fuente actual.

En lugar de desplazarse, CScrollView puede escalar automáticamente la vista al tamaño de la ventana actual. En este modo, la vista no tiene barras de desplazamiento y la vista lógica se estira o se reduce para ajustarse exactamente al área cliente de la ventana. Para usar esta funcionalidad de escalado hasta el ajuste, llame a CScrollView::SetScaleToFitSize. (Llame a SetScaleToFitSize o a SetScrollSizes, pero no a ambos).

Antes de llamar a la función miembro OnDraw de la clase de vista derivada, CScrollView ajusta automáticamente el origen de la ventanilla del objeto de contexto de dispositivo CPaintDC que pasa a OnDraw.

Para ajustar el origen de la ventanilla de la ventana de desplazamiento, CScrollView invalida CView::OnPrepareDC. Este ajuste es automático para el contexto de dispositivo CPaintDC que CScrollView pasa a OnDraw, pero debe llamar a CScrollView::OnPrepareDC para cualquier otro contexto de dispositivo que use, como CClientDC. Puede invalidar CScrollView::OnPrepareDC para establecer el lápiz, el color de fondo y otros atributos de dibujo, pero llame a la clase base para realizar el escalado.

Las barras de desplazamiento pueden aparecer en tres lugares relativos a una vista, como se muestra en los casos siguientes:

  • Las barras de desplazamiento de estilo de ventana estándar se pueden establecer para la vista mediante los WS_HSCROLL estilos de Windows y WS_VSCROLL .

  • Los controles de barra de desplazamiento también se pueden agregar al marco que contiene la vista, en cuyo caso el marco de trabajo reenvía los mensajes WM_HSCROLL y WM_VSCROLL de la ventana del marco a la vista activa actualmente.

  • El marco de trabajo también reenvía los mensajes de desplazamiento de un control de separador CSplitterWnd al panel separador activo actualmente (una vista). Cuando se coloca en un elemento CSplitterWnd con barras de desplazamiento compartidas, un objeto CScrollView usará las compartidas en lugar de crear las suyas propias.

Para obtener más información sobre el uso de CScrollView, consulte Arquitectura documento/vista y Clases de vistas derivadas disponibles en MFC.

Jerarquía de herencia

CObject

CCmdTarget

CWnd

CView

CScrollView

Requisitos

Encabezado: afxwin.h

CScrollView::CheckScrollBars

Llame a esta función miembro para determinar si la vista de desplazamiento tiene barras horizontales y verticales.

void CheckScrollBars(
    BOOL& bHasHorzBar,
    BOOL& bHasVertBar) const;

Parámetros

bHasHorzBar
Indica que la aplicación tiene una barra de desplazamiento horizontal.

bHasVertBar
Indica que la aplicación tiene una barra de desplazamiento vertical.

CScrollView::CScrollView

Construye un objeto CScrollView.

CScrollView();

Comentarios

Debe llamar a SetScrollSizes o SetScaleToFitSize antes de que se pueda usar la vista de desplazamiento.

CScrollView::FillOutsideRect

Llame a FillOutsideRect para rellenar el área de la vista que aparece fuera del área de desplazamiento.

void FillOutsideRect(
    CDC* pDC,
    CBrush* pBrush);

Parámetros

pDC
Contexto de dispositivo en el que se va a realizar el rellenado.

pBrush
Pincel con el que se va a rellenar el área.

Comentarios

Use FillOutsideRect en la función de controlador OnEraseBkgnd de la vista de desplazamiento para evitar un cambio excesivo del fondo.

Ejemplo

BOOL CMyScrollView::OnEraseBkgnd(CDC* pDC)
{
   CBrush br(GetSysColor(COLOR_WINDOW));
   FillOutsideRect(pDC, &br);
   return TRUE;                   // Erased
}

CScrollView::GetDeviceScrollPosition

Llame a GetDeviceScrollPosition cuando necesite las posiciones horizontales y verticales actuales de los cuadros de desplazamiento de las barras de desplazamiento.

CPoint GetDeviceScrollPosition() const;

Valor devuelto

Posiciones horizontales y verticales (en unidades de dispositivo) de los cuadros de desplazamiento como un objeto CPoint.

Comentarios

Este par de coordenadas corresponde a la ubicación del documento a la que se ha desplazado la esquina superior izquierda de la vista. Esto es útil para desplazar las posiciones de dispositivo del mouse a las posiciones de dispositivo de la vista de desplazamiento.

GetDeviceScrollPosition devuelve los valores en unidades de dispositivo. Si desea unidades lógicas, use GetScrollPosition en su lugar.

CScrollView::GetDeviceScrollSizes

GetDeviceScrollSizes obtiene el modo de asignación actual, el tamaño total y los tamaños de línea y página de la vista desplazable.

void GetDeviceScrollSizes(
    int& nMapMode,
    SIZE& sizeTotal,
    SIZE& sizePage,
    SIZE& sizeLine) const;

Parámetros

nMapMode
Devuelve el modo de asignación actual de esta vista. Para obtener una lista de los valores posibles, vea SetScrollSizes.

sizeTotal
Devuelve el tamaño total actual de la vista de desplazamiento en unidades de dispositivo.

sizePage
Devuelve las cantidades horizontales y verticales actuales para desplazarse en cada dirección en respuesta a un clic del mouse en el eje de una barra de desplazamiento. El miembro cx contiene la cantidad horizontal. El miembro cy contiene la cantidad vertical.

sizeLine
Devuelve las cantidades horizontales y verticales actuales para desplazarse en cada dirección en respuesta a un clic del mouse en una flecha de desplazamiento. El miembro cx contiene la cantidad horizontal. El miembro cy contiene la cantidad vertical.

Comentarios

Los tamaños están en unidades de dispositivo. Se llama a esta función miembro con poca frecuencia.

CScrollView::GetScrollPosition

Llame a GetScrollPosition cuando necesite las posiciones horizontales y verticales actuales de los cuadros de desplazamiento de las barras de desplazamiento.

CPoint GetScrollPosition() const;

Valor devuelto

Posiciones horizontales y verticales (en unidades lógicas) de los cuadros de desplazamiento como un objeto CPoint.

Comentarios

Este par de coordenadas corresponde a la ubicación del documento a la que se ha desplazado la esquina superior izquierda de la vista.

GetScrollPosition devuelve los valores en unidades lógicas. Si desea unidades de dispositivo, use GetDeviceScrollPosition en su lugar.

CScrollView::GetTotalSize

Llame a GetTotalSize para recuperar los tamaños horizontales y verticales actuales de la vista de desplazamiento.

CSize GetTotalSize() const;

Valor devuelto

Tamaño total de la vista de desplazamiento en unidades lógicas. El tamaño horizontal está en el miembro cx del valor devuelto CSize. El tamaño vertical está en el miembro cy.

CScrollView::ResizeParentToFit

Llame a ResizeParentToFit para permitir que el tamaño de la vista determine el tamaño de su ventana de marco.

void ResizeParentToFit(BOOL bShrinkOnly = TRUE);

Parámetros

bShrinkOnly
Tipo de cambio de tamaño que se va a realizar. El valor predeterminado, TRUE, reduce la ventana de marco si procede. Las barras de desplazamiento seguirán apareciendo para vistas grandes o ventanas de marco pequeñas. Un valor FALSE hace que la vista siempre cambie el tamaño de la ventana de marco exactamente. Esto puede ser algo peligroso, ya que la ventana de marco podría ser demasiado grande para caber dentro de la ventana de marco de la interfaz de múltiples documentos (MDI) o la pantalla.

Comentarios

Esto solo se recomienda para vistas en ventanas de marco secundarias MDI. Use ResizeParentToFit en la función de controlador OnInitialUpdate de la clase CScrollView derivada. Para ver un ejemplo de esta función miembro, consulte CScrollView::SetScrollSizes.

ResizeParentToFit supone que se ha establecido el tamaño de la ventana de la vista. Si el tamaño de la ventana de la vista no se ha establecido cuando se llama a ResizeParentToFit, obtendrá una aserción. Para asegurarse de que esto no suceda, realice la siguiente llamada antes de llamar a ResizeParentToFit:

GetParentFrame()->RecalcLayout();

CScrollView::ScrollToPosition

Llame a ScrollToPosition para desplazarse a un punto determinado de la vista.

void ScrollToPosition(POINT pt);

Parámetros

pt
Punto al que se va a desplazar, en unidades lógicas. El miembro x debe ser un valor positivo (mayor o igual que 0, hasta el tamaño total de la vista). Lo mismo sucede con el miembro y cuando el modo de asignación es MM_TEXT. El miembro y es negativo en los modos de asignación distintos de MM_TEXT.

Comentarios

La vista se desplazará para que este punto esté en la esquina superior izquierda de la ventana. No se debe llamar a esta función miembro si la vista se escala para ajustarse.

CScrollView::SetScaleToFitSize

Llame a SetScaleToFitSize cuando desee escalar automáticamente el tamaño de la ventanilla al tamaño actual de la ventana.

void SetScaleToFitSize(SIZE sizeTotal);

Parámetros

sizeTotal
Tamaños horizontales y verticales a los que se va a escalar la vista. El tamaño de la vista de desplazamiento se mide en unidades lógicas. El tamaño horizontal se encuentra en el miembro cx. El tamaño vertical se encuentra en el miembro cy. Tanto cx como cy deben ser mayores o iguales que 0.

Comentarios

Con las barras de desplazamiento, solo puede estar visible en cualquier momento una parte de la vista lógica. Sin embargo, con la funcionalidad de escalado hasta el ajuste, la vista no tiene barras de desplazamiento y la vista lógica se estira o se reduce para ajustarse exactamente al área cliente de la ventana. Cuando se cambia el tamaño de la ventana, la vista dibuja sus datos en una nueva escala en función del tamaño de la ventana.

Normalmente, colocará la llamada a SetScaleToFitSize en la invalidación de la función miembro OnInitialUpdate de la vista. Si no quiere escalado automático, llame a la función miembro SetScrollSizes en su lugar.

SetScaleToFitSize se puede usar para implementar una operación de tipo "ajustar el zoom al tamaño completo". Use SetScrollSizes para reinicializar el desplazamiento.

SetScaleToFitSize supone que se ha establecido el tamaño de la ventana de la vista. Si el tamaño de la ventana de la vista no se ha establecido cuando se llama a SetScaleToFitSize, obtendrá una aserción. Para asegurarse de que esto no suceda, realice la siguiente llamada antes de llamar a SetScaleToFitSize:

GetParentFrame()->RecalcLayout();

CScrollView::SetScrollSizes

Llame a SetScrollSizes cuando la vista esté a punto de actualizarse.

void SetScrollSizes(
    int nMapMode,
    SIZE sizeTotal,
    const SIZE& sizePage = sizeDefault,
    const SIZE& sizeLine = sizeDefault);

Parámetros

nMapMode
Modo de asignación que se va a establecer para esta vista. Los valores posibles son:

Modo de asignación Unidad lógica El eje Y positivo se extiende...
MM_TEXT 1 píxel Hacia abajo
MM_HIMETRIC 0,01 mm Hacia arriba
MM_TWIPS 1/1440 pulgada Hacia arriba
MM_HIENGLISH 0,001 pulgada Hacia arriba
MM_LOMETRIC 0,1 mm Hacia arriba
MM_LOENGLISH 0,01 pulgada Hacia arriba

Todos estos modos se definen mediante Windows. Para CScrollView, no se usan dos modos de asignación estándar, MM_ISOTROPIC y MM_ANISOTROPIC. La biblioteca de clases proporciona la función miembro SetScaleToFitSize para escalar la vista al tamaño de la ventana. La columna tres de la tabla anterior describe la orientación de las coordenadas.

sizeTotal
Tamaño total de la vista de desplazamiento. El miembro cx contiene la extensión horizontal. El miembro cy contiene la extensión vertical. Los tamaños están en unidades lógicas. Tanto cx como cy deben ser mayores o iguales que 0.

sizePage
Cantidades horizontales y verticales para desplazarse en cada dirección en respuesta a un clic del mouse en el eje de una barra de desplazamiento. El miembro cx contiene la cantidad horizontal. El miembro cy contiene la cantidad vertical.

sizeLine
Cantidades horizontales y verticales para desplazarse en cada dirección en respuesta a un clic del mouse en una flecha de desplazamiento. El miembro cx contiene la cantidad horizontal. El miembro cy contiene la cantidad vertical.

Comentarios

Llámelo en la invalidación de la función miembro OnUpdate para ajustar las características del desplazamiento cuando, por ejemplo, se muestra inicialmente el documento o cuando cambia el tamaño.

Normalmente, obtendrá información de tamaño del documento asociado a la vista mediante una llamada a una función miembro del documento, tal vez llamada GetMyDocSize, que proporcione con la clase de documento derivada. En el código siguiente, se muestra este enfoque:

CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(nMapMode, pMyDoc->GetMyDocSize());

Como alternativa, es posible que a veces tenga que establecer un tamaño fijo, como en el código siguiente:

SetScrollSizes(nMapMode, CSize(100, 100));

Debe establecer el modo de asignación en cualquiera de los modos de asignación de Windows excepto MM_ISOTROPIC y MM_ANISOTROPIC. Si desea usar un modo de asignación sin restricciones, llame a la función miembro SetScaleToFitSize en lugar de a SetScrollSizes.

Ejemplo

void CMyScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/,
   CObject* /*pHint*/)
{
   // Implement a GetMyDocSize() member function in 
   // your document class; it returns a CSize.
   CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
   SetScrollSizes(MM_LOENGLISH, pMyDoc->GetMyDocSize());
   ResizeParentToFit();   // Default bShrinkOnly argument
}

 

void CMyScrollView::OnInitialUpdate()
{
   CScrollView::OnInitialUpdate();

   // The GetMyDocSize() member function is implemented in 
   // your document class. The return type is CSize.
   CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
   SetScrollSizes(MM_TEXT, pMyDoc->GetMyDocSize());
}

Vea también

Ejemplo de MFCDIBLOOK
CView (clase)
Gráfico de jerarquías
CSplitterWnd (clase)