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 eWS_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
eWM_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 umaCSplitterWnd
com barras de rolagem compartilhadas, um objetoCScrollView
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
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