Partager via


Contrôles ActiveX MFC : peinture d'un contrôle ActiveX

Cet article décrit le processus de peinture d'un contrôle ActiveX et comment vous pouvez modifier le code de peinture pour optimiser le processus.(Voir l' optimiser le dessin de contrôle pour connaître les techniques permettant d'optimiser le dessin en n'ayant pas des contrôles afin individuellement les objets sélectionnés précédemment GDI.Après que tous les contrôles aient été dessinés, le conteneur peut automatiquement restaurer les objets d'origine.)

Exemples dans cet article sont d'un contrôle créé par l'Assistant Contrôle ActiveX MFC avec les paramètres par défaut.Pour plus d'informations sur la création d'une application de surveillance squelette à l'aide de l'Assistant Contrôle ActiveX MFC, consultez l'article L'Assistant Contrôle ActiveX MFC.

Les rubriques suivantes sont couvertes :

  • Le processus global pour peindre un contrôle et le code créés par l'Assistant Contrôle ActiveX pour prendre en charge la peinture

  • Optimisez procédure le processus de peinture

  • Peinture procédure votre contrôle à l'aide de les métafichiers

Le processus de peinture d'un contrôle ActiveX

Lorsque des contrôles ActiveX sont initialement affichés ou sont redessinés, ils suivent un processus de peinture similaire à d'autres applications développées à l'aide de MFC, avec une distinction importante : Les contrôles ActiveX peuvent être dans un état actif ou inactif.

Un contrôle actif est représenté dans un conteneur de contrôles ActiveX par une fenêtre enfant.Comme pour les autres fenêtres, il est responsable de se peindre lorsqu'un message d' WM_PAINT est accepté.La classe de base du contrôle, COleControl, gère ce message dans sa fonction d' OnPaint .Cette implémentation par défaut appelle la fonction d' OnDraw de votre contrôle.

Un contrôle inactif est peint différemment.Lorsque le contrôle est inactif, sa fenêtre est invisible ou inexistante, elle ne peut pas recevoir un message de peinture.À la place, le conteneur de contrôle appelle directement la fonction d' OnDraw du contrôle.Cela diffère du processus de peinture actif d'un contrôle car la fonction membre d' OnPaint n'est jamais appelée.

Comme discuté dans les paragraphes précédents, comment un contrôle ActiveX est mis à jour dépend de l'état du contrôle.Toutefois, l'infrastructure appelle la fonction membre d' OnDraw dans les deux cas, vous ajoutez la majeure partie de votre code de peinture de cette fonction membre.

La peinture d'un contrôle de handles de fonction membre d' OnDraw .Lorsqu'un contrôle est inactif, le conteneur de contrôle appelle OnDraw, en passant le contexte de périphérique du conteneur de contrôle et les coordonnées de la zone rectangulaire occupée par le contrôle.

Le rectangle passé par l'infrastructure à la fonction membre d' OnDraw contient la zone occupée par le contrôle.Si le contrôle est actif, l'angle supérieur gauche est (0, 0) et le contexte de périphérique passé à la fenêtre enfant qui contient le contrôle.Si le contrôle est inactif, la coordonnée supérieure gauche n'est pas nécessairement (0, 0) et le contexte de périphérique passé est pour le conteneur de contrôle contenant le contrôle.

[!REMARQUE]

Il est important que vos modifications à OnDrawne dépendent pas du point gauche supérieur du rectangle étant égal à (0, 0) et que vous dessinez uniquement à l'intérieur de le rectangle passé à OnDraw.Les résultats inattendus peuvent se produire si vous dessinez au delà de la zone du rectangle.

L'implémentation par défaut fournie par l'Assistant Contrôle ActiveX MFC dans le fichier d'implémentation du contrôle (.CPP), indiquées ci-après, peint le rectangle avec un pinceau blanc et remplit une ellipse avec la couleur d'arrière-plan actuelle.

void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   // TODO: Replace the following code with your own drawing code.
   pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
   pdc->Ellipse(rcBounds);
}

[!REMARQUE]

Lorsque vous peignez un contrôle, vous ne devez pas faire des hypothèses sur l'état du contexte de périphérique passé comme paramètre de pdc à la fonction d' OnDraw .Occasionnellement le contexte de périphérique est fourni par l'application conteneur et ne sera pas nécessairement initialisée à l'état par défaut.Sélectionnez en particulier, explicitement les stylets, les pinceaux, les couleurs, des polices, et d'autres ressources dont votre code de dessin dépend.

Optimiser votre code de peinture

Après que le contrôle se peigne avec succès, l'étape suivante est d'optimiser la fonction d' OnDraw .

L'implémentation par défaut du contrôle ActiveX vous peignez peint la zone de contrôle entière.Cela est suffisant pour les contrôles simples, mais dans de nombreux cas redessiner le contrôle est plus rapide si uniquement la partie que la mise à jour requis ont été redessiné, au lieu du contrôle entier.

La fonction d' OnDraw fournit une méthode simple d'optimisation en passant rcInvalid, le domaine rectangulaire du contrôle à redessiner.Utilisez cette zone, généralement plus petite que la zone de contrôle entière, pour accélérer le processus de peinture.

Peinture de votre contrôle à l'aide de les métafichiers

Dans la plupart des cas le paramètre d' pdc aux points de fonction d' OnDraw à un contexte de périphérique (DC).Toutefois, lors de l'impression des images ou du contrôle pendant une session d'aperçu avant impression, le contrôleur de domaine accepté pour afficher est un type spécial appelé « contexte de périphérique de métafichier ».Contrairement à un écran contrôleur de domaine, qui gère immédiatement les demandes ont envoyé, les magasins de contexte de périphérique de métafichier les demandes d'être lu ultérieurement.Certaines applications conteneur peuvent également choisir d'afficher l'image de contrôle à l'aide d'un contexte de périphérique de métafichier en mode Design.

Les demandes de dessin de métafichier peuvent être effectuées par le conteneur via deux fonctions d'interface : IViewObject::Draw (cette fonction peut également être appelée pour le dessin de non-métafichier) et IDataObject::GetData.Lorsqu'un contexte de périphérique de métafichier est passé comme un des paramètres, l'infrastructure MFC fait un appel à COleControl::OnDrawMetafile.Comme il s'agit d'une fonction membre virtuelle, remplacez cette fonction dans la classe de contrôle pour effectuer un traitement spécial.Le comportement par défaut appelle COleControl::OnDraw.

Pour vérifier le contrôle peut être dessiné dans l'écran et les contextes de périphérique de métafichier, vous devez utiliser uniquement les fonctions membres qui sont prises en charge dans un écran et un contexte de périphérique de métafichier.Sachez que le système de coordonnées ne peut être mesuré en pixels.

Étant donné que l'implémentation par défaut d' OnDrawMetafile appelle la fonction d' OnDraw du contrôle, utilisez uniquement les fonctions membres qui conviennent à un métafichier et un contexte de périphérique, à moins que vous substituiez OnDrawMetafile.Ce qui suit répertorie le sous-ensemble de fonctions membres d' CDC qui peuvent être utilisées dans un métafichier et un contexte de périphérique.Pour plus d'informations sur ces fonctionnalités, consultez la classe CDC dans MFC Reference.

Arc

BibBlt

Chord

Ellipse

Échappement

ExcludeClipRect

ExtTextOut

FloodFill

IntersectClipRect

LineTo

MoveTo

OffsetClipRgn

OffsetViewportOrg

OffsetWindowOrg

PatBlt

Pie

Polygon

Polyline

PolyPolygon

RealizePalette

RestoreDC

RoundRect

SaveDC

ScaleViewportExt

ScaleWindowExt

SelectClipRgn

SelectObject

SelectPalette

SetBkColor

SetBkMode

SetMapMode

SetMapperFlags

SetPixel

SetPolyFillMode

SetROP2

SetStretchBltMode

SetTextColor

SetTextJustification

SetViewportExt

SetViewportOrg

SetWindowExt

SetWindowORg

StretchBlt

TextOut

 

En plus de les fonctions membres d' CDC , il existe plusieurs autres fonctions qui sont compatibles dans un contexte de périphérique de métafichier.Ceux-ci incluent CPalette::AnimatePalette, CFont::CreateFontIndirect, les fonctions et composées de trois membres d' CBrush: CreateBrushIndirect, CreateDIBPatternBrush, et CreatePatternBrush.

Fonctions qui ne sont pas enregistrés dans un métafichier sont : DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC, et TabbedTextOut.Étant donné qu'un contexte de périphérique de métafichier n'est pas associé en fait avec un périphérique, vous ne pouvez pas utiliser SetDIBits, GetDIBits, et CreateDIBitmap à un contexte de périphérique de métafichier.Vous pouvez utiliser SetDIBitsToDevice et StretchDIBits à un contexte de périphérique de métafichier comme destination.CreateCompatibleDC, CreateCompatibleBitmap, et CreateDiscardableBitmap ne sont pas explicites à un contexte de périphérique de métafichier.

Un autre point à prendre en compte lors de l'utilisation d'un contexte de périphérique de métafichier est que le système de coordonnées ne peut être mesuré en pixels.Pour cette raison, tout votre code de dessin doit être ajusté pour tenir dans le rectangle passé à OnDrawdans le paramètre d' rcBounds .Cela empêché la peinture accidentelle en dehors de le contrôle car rcBounds représente la taille de la fenêtre du contrôle.

Une fois que vous avez implémenté le rendu de métafichier pour le contrôle, utilisez Test Container pour tester le métafichier.Pour plus d'informations sur la manière d'accéder à Test Container, consultez Test des propriétés et des événements à l'aide de Test Container.

Pour tester le métafichier du contrôle utilisation de Test Container

  1. Dans le menu de Edit de Test Container, cliquez sur Insert New Control.

  2. Dans la zone d' Insert New Control , sélectionnez le contrôle et cliquez sur OK.

    Le contrôle s'affiche dans le conteneur de test.

  3. Dans le menu de Contrôles , cliquez sur Draw Metafile.

    Une fenêtre séparée apparaît dans laquelle le métafichier est affiché.Vous pouvez modifier la taille de cette fenêtre pour voir comment mettre à l'échelle affecte le métafichier du contrôle.Vous pouvez fermer cette fenêtre à tout moment.

Voir aussi

Concepts

Contrôles ActiveX MFC