Desenhando uma exibição

Quase todo o desenho em seu aplicativo ocorre na função membro OnDraw de exibição, que você deve substituir na classe de exibição. (A exceção é o desenho do mouse, discutido na Interpretação da entrada de usuário por meio de uma exibição.) Sua substituição OnDraw:

  1. Obtém dados chamando as funções membro do documento fornecidos.

  2. Exibe os dados chamando funções membro de um objeto de contexto de dispositivo para a qual a estrutura passa para OnDraw.

Quando os dados de um documento são alterados de alguma forma, o modo de exibição deve ser redesenhado para refletir as alterações. Normalmente, isso acontece quando o usuário faz uma alteração por meio de uma exibição no documento. Nesse caso, o modo de exibição chama a função membro UpdateAllViews do documento para notificar todos os modos de exibição no mesmo documento para se atualizarem. UpdateAllViews chama a função membro OnUpdate de cada exibição. A implementação padrão deOnUpdate invalida toda a área de cliente da exibição. Você pode substituí-la para invalidar apenas as regiões da área de cliente que são mapeadas para as partes modificadas do documento.

A função membro UpdateAllViews da classe CDocument e a OnUpdatefunção membro de classe membro da classeCView permitem passar informações que descrevem quais partes do documento foram modificadas. Esse mecanismo de "dica" permite limitar a área que o modo de exibição deve redesenhar. OnUpdate usa dois argumentos "dica". O primeiro, lHint, do tipo LPARAM, permite que você passe os dados que quiser, enquanto o segundo, pHint, do tipo CObject*, permite passar um ponteiro para qualquer objeto derivado de CObject.

Quando um modo de exibição se torna inválido, o Windows envia uma mensagem WM_PAINT. A função de manipulador OnPaint do modo de exibição responde à mensagem criando um objeto de contexto de dispositivo da classe CPaintDC e chama a função membro do OnDraw seu modo de exibição. Normalmente, você não precisa escrever uma função de manipulador de substituição OnPaint.

Um contexto de dispositivo é uma estrutura de dados do Windows que contém informações sobre os atributos de desenho de um dispositivo, como uma exibição ou uma impressora. Todas as chamadas de desenho são feitas por meio de um objeto de contexto de dispositivo. Para desenhar na tela, OnDraw é passado um objeto CPaintDC. Para desenhar em uma impressora, é passado um objeto CDC configurado para a impressora atual.

Seu código para desenhar no modo de exibição primeiro recupera um ponteiro para o documento e, em seguida, faz chamadas de desenho por meio do contexto do dispositivo. O exemplo simples a seguir OnDraw ilustra o processo:

void CMyView::OnDraw(CDC* pDC)
{
   CMyDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   CString s = pDoc->GetData();   // Returns a CString
   CRect rect;
   GetClientRect(&rect);

   pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
   pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}

Neste exemplo, você definiria a função GetData como um membro da classe de documento derivada.

O exemplo imprime qualquer cadeia de caracteres que obtém do documento, centralizada no modo de exibição. Se a chamada OnDraw for para desenho de tela, o objetoCDC passado em pDC será um CPaintDC construtor que já chamou BeginPaint. As chamadas para funções de desenho são feitas por meio do ponteiro de contexto do dispositivo. Para obter informações sobre contextos de dispositivo e chamadas de desenho, consulte a classe CDC na referência MFC e Trabalhando com objetos de janela.

Para obter mais exemplos de como gravar OnDraw, consulte os Exemplos de MFC.

Confira também

Usando exibições