Partilhar via


Desenhando numa vista

Quase todo o desenho no seu aplicativo ocorre na função de membro da visualização, que deve ser substituída na sua classe de visualização. (A exceção é o desenho do mouse, discutido em Interpretando a entrada do usuário através de um modo de exibição.) A sua OnDraw substituição:

  1. Obtém dados chamando as funções de membro do documento que você fornece.

  2. Exibe os dados chamando funções membro de um objeto de contexto do dispositivo fornecido pela estrutura para OnDraw.

Quando os dados de um documento mudam de alguma forma, a exibição deve ser redesenhada 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, a vista chama a função de membro UpdateAllViews do documento para notificar todas as vistas no mesmo documento para que se atualizem. UpdateAllViews chama o método OnUpdate de cada visualização. A implementação padrão de OnUpdate invalida toda a área do cliente da visão. Pode substituir a função para invalidar apenas as regiões da área do cliente que correspondem às partes modificadas do documento.

A UpdateAllViews função de membro de classe CDocument e a OnUpdate função de membro de classe CView permitem que você passe informações descrevendo quais partes do documento foram modificadas. Este mecanismo de "sugestão" permite limitar a área que a exibição deve redesenhar. OnUpdate usa dois argumentos de "sugestão". O primeiro, lHint, do tipo LPARAM, permite que você passe quaisquer dados que você gosta, enquanto o segundo, pHint, do tipo CObject*, permite que você passe um ponteiro para qualquer objeto derivado de CObject.

Quando uma vista se torna inválida, o Windows envia-lhe uma mensagem WM_PAINT . A função manipuladora OnPaint da vista responde à mensagem, criando um objeto de contexto de dispositivo da classe CPaintDC e chamando a função de membro OnDraw da vista. Normalmente, não é necessário 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 um monitor ou uma impressora. Todas as chamadas de desenho são feitas por meio de um objeto de contexto de dispositivo. Para desenhar no ecrã, um objeto OnDraw é passado 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 através do contexto do dispositivo. O exemplo simples OnDraw a seguir 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 GetData função como um membro de sua classe de documento derivada.

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

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

Ver também

Usando Visões