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
:
Ottiene i dati chiamando le funzioni membro del documento fornite.
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. UpdateAllViews
chiama 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.