Condividi tramite


Controlli ActiveX MFC: Disegno del controllo ActiveX

In questo articolo viene descritto il processo di generazione del controllo ActiveX e come è possibile modificare il codice di disegno per ottimizzare il processo.(Vedere Ottimizzare il disegno del controllo per le tecniche su come ottimizzare il disegno in mancanza di controlli individualmente modalità gli oggetti GDI precedentemente selezionati.Dopo che tutti i controlli sono stati disegnati, il contenitore può automaticamente ripristinare gli oggetti originali.)

Gli esempi in questo articolo hanno origine da un controllo creato tramite la Creazione guidata controllo ActiveX MFC con le impostazioni predefinite.Per ulteriori informazioni sulla creazione di applicazioni di base del controllo mediante la Creazione guidata controllo ActiveX MFC, vedere l'articolo Creazione guidata controllo ActiveX MFC.

Gli argomenti seguenti vengono analizzati:

  • Il processo complessivo per il disegno di un controllo e del codice creati da Creazione guidata controllo ActiveX per supportare disegno

  • Come ottimizzare il processo di generazione

  • Come disegnare il controllo utilizzando metafile

Il processo di generazione di un controllo ActiveX

Quando i controlli ActiveX vengono visualizzati inizialmente o vengono ridisegnate, seguire un processo di generazione simile alle altre applicazioni sviluppate tramite MFC, con un'importante distinzione: I controlli ActiveX possono trovarsi in uno stato attivo o in uno stato inattivo.

Un controllo attivo viene rappresentato in un contenitore di controlli ActiveX da una finestra figlio.Analogamente ad altre finestre, è responsabile del disegno quando un messaggio di WM_PAINT viene ricevuto.La classe base del controllo, COleControl, gestisce questo messaggio nella propria funzione di OnPaint .Questa implementazione predefinita chiama la funzione di OnDraw del controllo.

Un controllo inattivo viene disegnato in modo diverso.Quando il controllo è inattivo, la finestra è invisibile o inesistente, pertanto non può ricevere un messaggio di disegno.Invece, il contenitore di controlli direttamente chiama la funzione di OnDraw del controllo.È diverso dal processo di generazione attivo di un controllo nella funzione membro di OnPaint non viene mai chiamata.

Come descritto nei paragrafi precedenti, ad esempio un controllo ActiveX viene aggiornato dipende dallo stato del controllo.Tuttavia, poiché il framework chiama la funzione membro di OnDraw in entrambi i casi, si aggiunge la maggior parte del codice di disegno nella funzione membro.

Handle della funzione membro di OnDraw controllano il disegno.Quando un controllo è inattivo, il contenitore di controlli chiama OnDraw, passando il contesto di dispositivo del contenitore di controlli e le coordinate dell'area rettangolare occupata dal controllo.

Il rettangolo passato dal framework alla funzione membro di OnDraw contiene l'area occupata dal controllo.Se il controllo è attivo, l'angolo superiore sinistro impostata su (0, 0) e il contesto di dispositivo passato alla finestra figlio che contiene il controllo.Se il controllo è inattivo, la coordinata superiore sinistra non è necessariamente (0, 0) e il contesto di dispositivo passato al contenitore di controlli che contiene il controllo.

[!NOTA]

È importante che le modifiche a OnDrawnon dipendono dal punto in alto a sinistra del rettangolo uguale a (0, 0) e che si disegna solo all'interno del rettangolo passato a OnDraw.Si potrebbero ottenere risultati imprevisti se si disegna oltre l'area del rettangolo.

L'implementazione predefinita fornita da Creazione guidata controllo ActiveX MFC nel file di implementazione del controllo (.CPP), come illustrato di seguito, il rettangolo disegnato con un pennello bianco e riempie l'ellisse di colore di sfondo corrente.

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);
}

[!NOTA]

Quando si disegna un controllo, non è necessario apportare le ipotesi relative allo stato del contesto di dispositivo che viene passato come parametro pdc della funzione di OnDraw.Talvolta il contesto di dispositivo è fornito dall'applicazione contenitore e non necessariamente verrà inizializzato allo stato predefinito.In particolare, in modo esplicito selezionare penne, pennelli, colori, tipi di carattere e altre risorse che il codice di disegno dipende.

Ottimizzare il codice di disegno

Dopo aver correttamente il controllo viene dipingendosi, il passaggio successivo consiste nell'ottimizzare la funzione di OnDraw .

L'implementazione predefinita di disegno del controllo ActiveX disegna l'intera area di controllo.Ciò è sufficiente per controlli semplici, ma in molti casi aggiornare il controllo risulta più veloce se solo la parte che l'aggiornamento non è stato aggiornato, anziché l'intero controllo.

La funzione di OnDraw fornisce un metodo semplice di ottimizzazione passando rcInvalid, l'area rettangolare del controllo che deve ridisegno.Utilizzare questa area, in genere più piccola dell'intera area di controllo, per velocizzare il processo di generazione.

Disegno del controllo utilizzando metafile

Nella maggior parte dei casi il parametro di pdc ai punti di funzione di OnDraw a un contesto di dispositivo dello (DC) schermo.Tuttavia, quando le immagini di stampa del controllo o durante una sessione di anteprima di stampa, il controller di dominio ricevuto per eseguire il rendering è un tipo speciale denominato “un controller di dominio del metafile„.A differenza di un controller di dominio dello schermo, immediatamente gestisce le richieste inviate a, archivi di controller di dominio del metafile richieste per essere riprodotta in un secondo momento.Alcune applicazioni contenitori è possibile scegliere di eseguire il rendering dell'immagine del controllo utilizzando un controller di dominio del metafile in modalità progettazione.

Le richieste di disegno metafile possono essere eseguite dal contenitore con due funzioni dell'interfaccia: IViewObject::Draw (questa funzione può anche essere chiamata per il disegno di non metafile) e IDataObject::GetData.Quando un controller di dominio del metafile viene passato come uno dei parametri, il framework MFC effettua una chiamata a COleControl::OnDrawMetafile.Poiché si tratta di una funzione membro virtuale, eseguire l'override della funzione nella classe del controllo per eseguire l'elaborazione speciale.Il comportamento predefinito chiama COleControl::OnDraw.

Per assicurarsi che il controllo sia schermo in quali contesti di periferica metafile, è necessario utilizzare solo le funzioni membro che sono supportati sia in uno schermo che in un controller di dominio del metafile.Tenere presente che il sistema di coordinate non può essere espresso in pixel.

Poiché l'implementazione predefinita di OnDrawMetafile chiama la funzione di OnDraw del controllo, utilizzare solo funzioni membro che sono adatte sia per i metafile che un contesto di dispositivo dello schermo, se non si esegue l'override di OnDrawMetafile.L'esempio seguente è elencato il sottoinsieme delle funzioni membro di CDC che possono essere utilizzate sia) in che in un contesto di dispositivo dello schermo.Per ulteriori informazioni su queste funzioni, vedere la classe CDCin riferimenti alla libreria MFC.

Arco

BibBlt

Corda

Ellipse

Escape

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

 

Oltre alle funzioni membro di CDC , esistono diverse altre funzioni che sono compatibili in un controller di dominio del metafile.Questi includono CPalette::AnimatePalette, CFont::CreateFontIndirecte le funzioni di tre membri di CBrush: CreateBrushIndirect, CreateDIBPatternBrushe CreatePatternBrush.

Le funzioni che non vengono registrate in un metafile sono: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDCe TabbedTextOut.Poiché un controller di dominio del metafile non è in realtà associato a un dispositivo, non è possibile utilizzare SetDIBits, GetDIBits e CreateDIBitmap con un controller di dominio del metafile.È possibile utilizzare SetDIBitsToDevice e StretchDIBits con un controller di dominio del metafile come destinazione.CreateCompatibleDC, CreateCompatibleBitmape CreateDiscardableBitmap non sono significativi con un controller di dominio del metafile.

Un altro punto che possono verificarsi quando si utilizza un controller di dominio del metafile è che il sistema di coordinate non può essere espresso in pixel.Per questo motivo, tutto il codice di disegno deve essere regolato per adattarsi al rettangolo passato a OnDrawnel parametro di rcBounds .Ciò impedisce il disegno accidentali all'esterno del controllo perché rcBounds rappresenta la dimensione della finestra del controllo.

Dopo avere implementato il rendering di metafile per il controllo, utilizzare Test Container per testare metafile.Per ulteriori informazioni sulla modalità di accesso a Test Container, vedere Verifica di proprietà ed eventi tramite Test Container.

Per testare i metafile del controllo utilizzando Test Container

  1. Scegliere dal menu di Modifica di Test Container, fare clic Insert New Control.

  2. Nella casella di Insert New Control , selezionare il controllo e scegliere OK.

    Il controllo verrà visualizzato nell'elenco di test.

  3. Scegliere dal menu di Controllo , fare clic Draw Metafile.

    Una finestra separata viene visualizzato in cui i metafile visualizzare.È possibile modificare la dimensione della finestra per vedere come ridimensionare influisce sui metafile del controllo.È possibile chiudere questa finestra in qualsiasi momento.

Vedere anche

Concetti

Controlli ActiveX MFC