Disegno in una visualizzazione

Quasi tutto il disegno nell'applicazione si verifica nella funzione membro della OnDraw visualizzazione, che è necessario eseguire l'override nella classe di visualizzazione. (L'eccezione è il disegno del mouse, discusso in Interpretazione dell'input dell'utente tramite una visualizzazione. Override OnDraw :

  1. Ottiene i dati chiamando le funzioni membro del documento fornite.

  2. Visualizza i dati chiamando le funzioni membro di un oggetto contesto dispositivo passato dal framework a OnDraw.

Quando i dati di un documento cambiano in qualche modo, la visualizzazione deve essere ridisegnata per riflettere le modifiche. In genere, ciò si verifica quando l'utente apporta una modifica tramite una visualizzazione nel documento. In questo caso, la visualizzazione chiama la funzione membro UpdateAllViews del documento per notificare a tutte le visualizzazioni dello stesso documento di aggiornarsi autonomamente. UpdateAllViewschiama la funzione membro OnUpdate di ogni visualizzazione. L'implementazione predefinita di OnUpdate invalida l'intera area client della visualizzazione. È possibile eseguirne l'override per invalidare solo le aree dell'area client mappate alle parti modificate del documento.

La UpdateAllViews funzione membro della classe CDocument e la OnUpdate funzione membro della classe CView consentono di passare informazioni che descrivono quali parti del documento sono state modificate. Questo meccanismo di "hint" consente di limitare l'area che la vista deve ridisegnare. OnUpdate accetta due argomenti "hint". Il primo, lHint, di tipo LPARAM, consente di passare tutti i dati desiderati, mentre il secondo, pHint, di tipo CObject*, consente di passare un puntatore a qualsiasi oggetto derivato da CObject.

Quando una visualizzazione non è valida, Windows lo invia a un messaggio di WM_PAINT . La funzione del gestore OnPaint della visualizzazione risponde al messaggio creando un oggetto contesto dispositivo della classe CPaintDC e chiama la funzione membro della OnDraw visualizzazione. In genere non è necessario scrivere una funzione del gestore di override OnPaint .

Un contesto di dispositivo è una struttura di dati di Windows che contiene informazioni sugli attributi di disegno di un dispositivo, ad esempio uno schermo o una stampante. Tutte le chiamate di disegno vengono effettuate tramite un oggetto contesto dispositivo. Per il disegno sullo schermo, OnDraw viene passato un CPaintDC oggetto . Per il disegno su una stampante, viene passato un oggetto CDC configurato per la stampante corrente.

Il codice per il disegno nella visualizzazione recupera innanzitutto un puntatore al documento, quindi effettua chiamate di disegno tramite il contesto del dispositivo. L'esempio semplice OnDraw seguente illustra il 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());
}

In questo esempio si definirà la GetData funzione come membro della classe documento derivata.

Nell'esempio viene stampata qualsiasi stringa ottenuta dal documento, allineata al centro nella visualizzazione. Se la chiamata è per il OnDraw disegno dello schermo, l'oggetto CDC passato in pDC è un CPaintDC il cui costruttore ha già chiamato BeginPaint. Le chiamate alle funzioni di disegno vengono effettuate tramite il puntatore di contesto del dispositivo. Per informazioni sui contesti di dispositivo e sulle chiamate di disegno, vedere classe CDC nella guida di riferimento MFC e Uso degli oggetti finestra.

Per altri esempi di come scrivere OnDraw, vedere gli esempi MFC.

Vedi anche

Uso delle visualizzazioni