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 yWS_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
yWM_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 elementoCSplitterWnd
con barras de desplazamiento compartidas, un objetoCScrollView
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
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)