Dessin dans une vue
Presque tous les dessins de votre application se produisent dans la fonction membre de OnDraw
la vue, que vous devez remplacer dans votre classe d’affichage. (L’exception est le dessin de la souris, abordé dans Interprétation de l’entrée de l’utilisateur par le biais d’une vue.) Votre OnDraw
remplacement :
Obtient des données en appelant les fonctions membres du document que vous fournissez.
Affiche les données en appelant des fonctions membres d’un objet de contexte d’appareil que l’infrastructure passe à
OnDraw
.
Lorsque les données d’un document changent d’une certaine manière, la vue doit être redessinée pour refléter les modifications. En règle générale, cela se produit lorsque l’utilisateur effectue une modification par le biais d’une vue sur le document. Dans ce cas, la vue appelle la fonction membre UpdateAllViews du document pour notifier toutes les vues du même document pour se mettre à jour. UpdateAllViews
appelle la fonction membre OnUpdate de chaque vue. L’implémentation par défaut invalide OnUpdate
l’ensemble de la zone cliente de la vue. Vous pouvez le remplacer pour invalider uniquement les régions de la zone cliente qui mappent aux parties modifiées du document.
La UpdateAllViews
fonction membre de la classe CDocument
et la OnUpdate
fonction membre de la classe CView
vous permettent de transmettre des informations décrivant les parties du document qui ont été modifiées. Ce mécanisme « hint » vous permet de limiter la zone que la vue doit redessiner. OnUpdate
prend deux arguments « hint ». Le premier, lHint, de type LPARAM, vous permet de passer toutes les données que vous aimez, tandis que le second, pHint, de type CObject
*, vous permet de passer un pointeur vers n’importe quel objet dérivé de CObject
.
Lorsqu’une vue devient non valide, Windows l’envoie un message WM_PAINT . La fonction de gestionnaire OnPaint de la vue répond au message en créant un objet de contexte d’appareil de la classe CPaintDC et en appelant la fonction membre de OnDraw
votre vue. Normalement, vous n’avez pas besoin d’écrire une fonction de gestionnaire substituée OnPaint
.
Un contexte d’appareil est une structure de données Windows qui contient des informations sur les attributs de dessin d’un appareil, tels qu’un affichage ou une imprimante. Tous les appels de dessin sont effectués via un objet de contexte d’appareil. Pour dessiner à l’écran, OnDraw
un objet est passé CPaintDC
. Pour dessiner sur une imprimante, il est passé un objet CDC configuré pour l’imprimante active.
Votre code de dessin dans la vue récupère d’abord un pointeur vers le document, puis effectue des appels de dessin via le contexte de l’appareil. L’exemple simple OnDraw
suivant illustre le processus :
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());
}
Dans cet exemple, vous définissez la GetData
fonction en tant que membre de votre classe de document dérivée.
L’exemple imprime la chaîne qu’elle obtient à partir du document, centrée dans l’affichage. Si l’appel concerne le dessin d’écran, l’objet passé dans pDC est un CPaintDC
constructeur dont le CDC
OnDraw
constructeur a déjà appelé BeginPaint
. Les appels aux fonctions de dessin sont effectués via le pointeur de contexte de l’appareil. Pour plus d’informations sur les contextes d’appareil et les appels de dessin, consultez capture de données modifiées de classe dans la référence MFC et utilisation des objets Window.
Pour plus d’exemples d’écriture OnDraw
, consultez les exemples MFC.