Classe CScrollView

Uma CView com recursos de rolagem.

Sintaxe

class CScrollView : public CView

Membros

Construtores Protegidos

Nome Descrição
CScrollView::CScrollView Constrói um objeto CScrollView.

Métodos públicos

Nome Descrição
CScrollView::CheckScrollBars Indica se a exibição de rolagem tem barras de rolagem horizontais e verticais.
CScrollView::FillOutsideRect Preenche a área de uma exibição fora da área de rolagem.
CScrollView::GetDeviceScrollPosition Obtém a posição de rolagem atual em unidades do dispositivo.
CScrollView::GetDeviceScrollSizes Obtém o modo de mapeamento atual, o tamanho total e os tamanhos de linha e página do modo de exibição rolável. Os tamanhos estão em unidades do dispositivo.
CScrollView::GetScrollPosition Obtém a posição de rolagem atual em unidades lógicas.
CScrollView::GetTotalSize Obtém o tamanho total da exibição de rolagem em unidades lógicas.
CScrollView::ResizeParentToFit Faz com que o tamanho da exibição determine o tamanho de seu quadro.
CScrollView::ScrollToPosition Rola o modo de exibição até determinado ponto, especificado em unidades lógicas.
CScrollView::SetScaleToFitSize Coloca a exibição de rolagem no modo ajustar para caber.
CScrollView::SetScrollSizes Define o modo de mapeamento da exibição de rolagem, o tamanho total e as quantidades de rolagem horizontal e vertical.

Comentários

Você pode manipular a rolagem padrão em qualquer classe derivada de CView substituindo as funções mapeadas por mensagem OnHScroll e funções membro OnVScroll. Mas CScrollView adiciona os seguintes recursos às funcionalidades de CView:

  • Gerencia tamanhos de janela e visor e modos de mapeamento.

  • Rola automaticamente em resposta a mensagens de barra de rolagem.

  • Rola automaticamente em resposta a mensagens do teclado, a um mouse sem rolagem ou ao botão de rolagem do IntelliMouse.

Para rolar automaticamente em resposta às mensagens do teclado, adicione uma mensagem WM_KEYDOWN e teste VK_DOWN, VK_PREV e chame SetScrollPos.

Você pode manipular a rolagem do botão de rolagem do mouse por conta própria substituindo as funções mapeadas por mensagem OnMouseWheel e funções membro OnRegisteredMouseWheel. Como são para CScrollView, essas funções membro dão suporte ao comportamento recomendado para WM_MOUSEWHEEL, a mensagem de rotação do botão.

Para aproveitar a rolagem automática, derive sua classe de exibição de CScrollView em vez de CView. Quando a exibição for criada pela primeira vez, se você quiser calcular o tamanho do modo de exibição rolável com base no tamanho do documento, chame a função de membro SetScrollSizes da substituição de um CView::OnInitialUpdate ou CView::OnUpdate. (Você deve escrever seu próprio código para consultar o tamanho do documento. Para obter um exemplo, consulte o Exemplo de scribble).

A chamada para a função de membro SetScrollSizes define o modo de mapeamento da exibição, as dimensões totais da exibição de rolagem e os valores a serem rolados horizontal e verticalmente. Todos os tamanhos estão em unidades lógicas. O tamanho lógico da exibição geralmente é calculado com base nos dados armazenados no documento, mas em alguns casos talvez você queira especificar um tamanho fixo. Para consultar exemplos das duas abordagens, confira CScrollView::SetScrollSizes.

Especifique os valores a serem rolados horizontal e verticalmente em unidades lógicas. Por padrão, se o usuário clicar em um eixo de barra de rolagem fora da caixa de rolagem, CScrollView rolará uma "página". Se o usuário clicar em uma seta de rolagem em qualquer extremidade de uma barra de rolagem, CScrollView rolará uma "linha". Por padrão, uma página é 1/10 do tamanho total da exibição; uma linha é 1/10 do tamanho da página. Substitua esses valores padrão passando tamanhos personalizados na função de membro SetScrollSizes. Por exemplo, você pode definir o tamanho horizontal como alguma fração da largura do tamanho total e do tamanho vertical para a altura de uma linha na fonte atual.

Em vez de rolar, CScrollView pode dimensionar automaticamente o modo de exibição para o tamanho da janela atual. Nesse modo, o modo de exibição não tem barras de rolagem e o modo de exibição lógico é estendido ou reduzido para se ajustar exatamente à área de cliente da janela. Para usar essa funcionalidade de escalar para ajustar, chame CScrollView::SetScaleToFitSize. (Chame SetScaleToFitSize ou SetScrollSizes, mas não ambos).

Antes que a função de membro OnDraw da classe de exibição derivada seja chamada, CScrollView ajusta automaticamente a origem do visor para o objeto de contexto do dispositivo CPaintDC que ele passa para OnDraw.

Para ajustar a origem do visor para a janela de rolagem, CScrollView substitui CView::OnPrepareDC. Esse ajuste é automático para o contexto do dispositivo CPaintDC, que CScrollView passa para OnDraw, mas você mesmo precisa chamar CScrollView::OnPrepareDC para quaisquer outros contextos de dispositivo usados, como um CClientDC. Você pode substituir CScrollView::OnPrepareDC para definir a caneta, a cor da tela de fundo e outros atributos de desenho, mas chamar a classe base para fazer dimensionamento.

As barras de rolagem podem aparecer em três locais em relação a uma exibição, conforme mostrado nos casos a seguir:

  • As barras de rolagem padrão no estilo de janela podem ser definidas para o modo de exibição usando os WS_HSCROLL estilos e WS_VSCROLL Windows.

  • Controles de barra de rolagem também podem ser adicionados ao quadro que contém a exibição, o caso em que a estrutura encaminha as mensagens WM_HSCROLL e WM_VSCROLL da janela do quadro para o modo de exibição ativo no momento.

  • A estrutura também encaminha mensagens de rolagem de um controle de divisor CSplitterWnd para o painel de divisor ativo no momento (um modo de exibição). Quando colocado em uma CSplitterWnd com barras de rolagem compartilhadas, um objeto CScrollView usará as barras compartilhadas em vez de criar as suas.

Para obter mais informações sobre como usar CScrollView, consulte Arquitetura de documento/exibição e Classes de exibição derivadas disponíveis no MFC.

Hierarquia de herança

CObject

CCmdTarget

CWnd

CView

CScrollView

Requisitos

Cabeçalho: afxwin.h

CScrollView::CheckScrollBars

Chame essa função membro para determinar se o modo de exibição de rolagem tem barras horizontais e verticais.

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

Parâmetros

bHasHorzBar
Indica que o aplicativo tem uma barra de rolagem horizontal.

bHasVertBar
Indica que o aplicativo tem uma barra de rolagem vertical.

CScrollView::CScrollView

Constrói um objeto CScrollView.

CScrollView();

Comentários

Você deve chamar SetScrollSizes ou SetScaleToFitSize antes que o modo de exibição de rolagem seja utilizável.

CScrollView::FillOutsideRect

Chame FillOutsideRect para preencher a área de exibição que aparece fora da área de rolagem.

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

Parâmetros

pDC
Contexto de dispositivo no qual o preenchimento deve ser feito.

pBrush
Pincel com o qual a área deve ser preenchida.

Comentários

Use FillOutsideRect na função de manipulador OnEraseBkgnd da exibição de rolagem para evitar que ocorra repintura excessiva em segundo plano.

Exemplo

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

CScrollView::GetDeviceScrollPosition

Chame GetDeviceScrollPosition quando precisar das posições horizontais e verticais atuais das caixas de rolagem nas barras de rolagem.

CPoint GetDeviceScrollPosition() const;

Valor de retorno

As posições horizontais e verticais (em unidades de dispositivo) das caixas de rolagem como um objeto CPoint.

Comentários

Esse par de coordenadas corresponde ao local no documento ao qual o canto superior esquerdo da exibição foi rolado. Isso é útil para deslocar as posições do dispositivo do mouse para as posições do dispositivo de exibição de rolagem.

GetDeviceScrollPosition retorna valores em unidades de dispositivo. Se quiser unidades lógicas, deverá usar GetScrollPosition em vez disso.

CScrollView::GetDeviceScrollSizes

GetDeviceScrollSizes obtém o modo de mapeamento atual, o tamanho total e os tamanhos de linha e página do modo de exibição rolável.

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

Parâmetros

nMapMode
Retorna o modo de mapeamento atual da exibição. Para obter uma lista de valores possíveis, consulte SetScrollSizes.

sizeTotal
Retorna o tamanho total atual da exibição de rolagem em unidades de dispositivo.

sizePage
Retorna as quantidades horizontais e verticais atuais para rolar em cada direção em resposta a um clique do mouse em um eixo de barra de rolagem. O membro cx contém a quantidade horizontal. O membro cy contém a quantidade vertical.

sizeLine
Retorna as quantidades horizontais e verticais atuais para rolar em cada direção em resposta a um clique do mouse em um eixo da seta de rolagem. O membro cx contém a quantidade horizontal. O membro cy contém a quantidade vertical.

Comentários

Os tamanhos estão em unidades do dispositivo. Essa função membro é chamada raramente.

CScrollView::GetScrollPosition

Chame GetScrollPosition quando precisar das posições horizontais e verticais atuais das caixas de rolagem nas barras de rolagem.

CPoint GetScrollPosition() const;

Valor de retorno

As posições horizontais e verticais (em unidades lógicas) das caixas de rolagem como um objeto CPoint.

Comentários

Esse par de coordenadas corresponde ao local no documento ao qual o canto superior esquerdo da exibição foi rolado.

GetScrollPosition returna valores em unidades lógicas. Se quiser unidades de dispositivo, deverá usar GetDeviceScrollPosition em vez disso.

CScrollView::GetTotalSize

Chame GetTotalSize para recuperar os tamanhos horizontal e vertical atuais da exibição de rolagem.

CSize GetTotalSize() const;

Valor de retorno

O tamanho total da exibição de rolagem em unidades lógicas. O tamanho horizontal está no membro cx do valor retornado de CSize. O tamanho vertical está no membro cy.

CScrollView::ResizeParentToFit

Chame ResizeParentToFit para permitir que o tamanho da exibição determine o tamanho da janela do quadro.

void ResizeParentToFit(BOOL bShrinkOnly = TRUE);

Parâmetros

bShrinkOnly
O tipo de redimensionamento a ser executado. O valor padrão, TRUE, reduz a janela de quadros, se apropriado. As barras de rolagem ainda aparecerão para exibições grandes ou janelas de quadros pequenos. Um valor de FALSE faz com que a exibição sempre redimensione exatamente a janela do quadro. Isso pode ser um pouco perigoso, pois a janela do quadro pode ficar muito grande para caber dentro da janela do quadro de várias interfaces de documento (MDI) ou na tela.

Comentários

Isso é recomendado apenas para exibições em janelas de quadro filho do MDI. Use ResizeParentToFit na função de manipulador OnInitialUpdate de sua classe derivada CScrollView. Para obter um exemplo dessa função de membro, consulte CScrollView::SetScrollSizes.

ResizeParentToFit pressupõe que o tamanho da janela de exibição tenha sido definido. Se o tamanho da janela de exibição não tiver sido definido quando ResizeParentToFit foi chamado, você receberá uma declaração. Para garantir que isso não aconteça, faça a seguinte chamada antes de chamar ResizeParentToFit:

GetParentFrame()->RecalcLayout();

CScrollView::ScrollToPosition

Call ScrollToPosition to scroll to a given point in the view.

void ScrollToPosition(POINT pt);

Parâmetros

pt
O ponto para onde rolar, em unidades lógicas. O membro x deve ser um valor positivo (maior ou igual a 0, até o tamanho total da exibição). O mesmo vale para o membro y quando o modo de mapeamento for MM_TEXT. O membro y será negativo em modos de mapeamento diferentes de MM_TEXT.

Comentários

O modo de exibição será rolado para que este ponto esteja no canto superior esquerdo da janela. Essa função membro não deve ser chamada caso a exibição tenha sido dimensionada para ajustar.

CScrollView::SetScaleToFitSize

Chame SetScaleToFitSize quando quiser dimensionar o tamanho do visor para o tamanho da janela atual automaticamente.

void SetScaleToFitSize(SIZE sizeTotal);

Parâmetros

sizeTotal
Os tamanhos horizontais e verticais para os quais a exibição deve ser dimensionada. O tamanho da exibição de rolagem é medido em unidades lógicas. O tamanho horizontal está contido no membro cx. O tamanho vertical está contido no membro cy. cx e cy devem ser maior ou igual a zero.

Comentários

Com barras de rolagem, apenas uma parte da exibição lógica pode estar visível a qualquer momento. Porém, com a funcionalidade dimensionar e ajustar, o modo de exibição não tem barras de rolagem e o modo de exibição lógico é estendido ou reduzido para se ajustar exatamente à área de cliente da janela. Quando a janela é redimensionada, a exibição desenha seus dados em uma nova escala com base no tamanho da janela.

Normalmente, você colocará a chamada para SetScaleToFitSize na substituição da função membro OnInitialUpdate da exibição. Se você não quiser dimensionamento automático, chame a função membro SetScrollSizes.

SetScaleToFitSize pode ser usado para implementar uma operação "Zoom to Fit". Use SetScrollSizes para reinicializar a rolagem.

SetScaleToFitSize pressupõe que o tamanho da janela de exibição tenha sido definido. Se o tamanho da janela de exibição não tiver sido definido quando SetScaleToFitSize foi chamado, você receberá uma declaração. Para garantir que isso não aconteça, faça a seguinte chamada antes de chamar SetScaleToFitSize:

GetParentFrame()->RecalcLayout();

CScrollView::SetScrollSizes

Chame SetScrollSizes quando o modo de exibição estiver prestes a ser atualizado.

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

Parâmetros

nMapMode
O modo de mapeamento a ser definido para essa exibição. Entre os valores possíveis estão:

Modo de Mapeamento Unidade Lógica Extensão do eixo y positivo...
MM_TEXT 1 pixel Para baixo
MM_HIMETRIC 0,01 mm Ascendente
MM_TWIPS 1/1440 pol. Ascendente
MM_HIENGLISH 0,001 pol. Ascendente
MM_LOMETRIC 0,1 mm Ascendente
MM_LOENGLISH 0,01 pol. Ascendente

Todos esses modos são definidos pelo Windows. Dois modos de mapeamento padrão, MM_ISOTROPIC e MM_ANISOTROPIC, não são usados por CScrollView. A biblioteca de classes fornece a função membro SetScaleToFitSize para dimensionar a exibição para o tamanho da janela. A coluna três na tabela acima descreve a orientação da coordenada.

sizeTotal
O tamanho total da exibição de rolagem. O membro cx contém a extensão horizontal. O membro cy contém a extensão vertical. Os tamanhos estão em unidades lógicas. cx e cy devem ser maior ou igual a zero.

sizePage
As quantidades horizontais e verticais a serem roladas em cada direção, em resposta a um clique do mouse em um eixo de barra de rolagem. O membro cx contém a quantidade horizontal. O membro cy contém a quantidade vertical.

sizeLine
As quantidades horizontais e verticais a serem roladas em cada direção em resposta a um clique do mouse em uma seta de rolagem. O membro cx contém a quantidade horizontal. O membro cy contém a quantidade vertical.

Comentários

Chame-o na substituição da função de membro OnUpdate para ajustar as características de rolagem quando, por exemplo, o documento for exibido inicialmente ou quando ele alterar o tamanho.

Normalmente, você obterá informações de tamanho do documento associado à exibição chamando uma função de membro de documento, talvez chamada GetMyDocSize, que você fornece com sua classe de documento derivada. O código a seguir mostra essa abordagem:

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

Como alternativa, algumas vezes pode ser necessário definir um tamanho fixo, como no código a seguir:

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

Você deve definir o modo de mapeamento para qualquer um dos modos de mapeamento do Windows, exceto MM_ISOTROPIC ou MM_ANISOTROPIC. Se quiser usar um modo de mapeamento não treinado, chame a função de membro SetScaleToFitSize em vez de SetScrollSizes.

Exemplo

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());
}

Confira também

Exemplo de MFC DIBLOOK
Classe CView
Gráfico da hierarquia
Classe CSplitterWnd