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
:
Obtém dados chamando as funções membro do documento fornecidos.
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 OnUpdate
funçã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.