MFC-ActiveX-Steuerelemente: Zeichnen eines ActiveX-Steuerelements

In diesem Artikel wird das ActiveX-Steuerelement-Zeichnen Code und Farben ändern, um den Vorgang zu optimieren.(Siehe Optimieren zeichnung Steuerelements für Techniken, wie Zeichnung indem Sie können Steuerelemente einzeln zuvor ausgewählte GDI-Objekte nicht wiederherstellen optimiert.Nachdem alle Steuerelemente gezeichnet wurden, kann der Container die ursprünglichen Objekte automatisch wiederhergestellt werden.)

Beispiele in diesem Artikel werden von einem Steuerelement, das aus dem MFC-ActiveX-Steuerelement-Assistenten mit Standardeinstellungen erstellt wird.Weitere Informationen zum Erstellen einer Skelett steuer-Anwendung mit dem MFC-ActiveX-Steuerelement-Assistenten finden Sie im Artikel MFC-ActiveX-Steuerelement-Assistent.

In den folgenden Themen werden behandelt:

  • Der allgemeine Verfahren zum Zeichnen eines Steuerelements und des Codes erstellt aus dem ActiveX-Steuerelement-Assistenten zum Zeichnen zu unterstützen

  • So erstellen Sie das Zeichnen optimiert

  • So erstellen Sie das Steuerelement mithilfe von Metadateien zeichnet

Das Zeichnen eines ActiveX-Steuerelements

Wenn ActiveX-Steuerelement zunächst angezeigt oder neu gezeichnet werden, führen sie einem Zeichnen, das für andere Anwendungen, die mit MFC in einem wichtigen Unterschied entwickelt werden: ActiveX-Steuerelemente können in einem aktiven oder in einem inaktiven Zustand befinden.

Ein aktives Steuerelement wird in einem ActiveX-Steuerelement-Container über ein untergeordnetes Fenster dargestellt.Wie andere Fenster ist es für das Zeichnen WM_PAINT verantwortlich, wenn eine Nachricht empfangen wird.Die Basisklasse des Steuerelements, COleControl, in der diese Nachricht behandelt OnPaint-Funktion.Diese Standardimplementierung ruft die OnDraw-Funktion des Steuerelements an.

Ein inaktives Steuerelement gezeichnet wird.Wenn das Steuerelement inaktiv ist, ist das Fenster entweder nicht vorhanden oder nicht sichtbar, sodass es eine paint-Meldung nicht erhalten.Stattdessen Aufruf der Funktion OnDraw direkt mit den Steuerelementcontainer des Steuerelements.Dies unterscheidet sich vom aktiven Zeichnen eines Steuerelements darin, dass die OnPaint-Memberfunktion nie aufgerufen wird.

Wie in den vorangehenden Abschnitten wird erläutert, wie ein ActiveX-Steuerelement aktualisiert wird, hängt vom Zustand des Steuerelements ab.Da das Framework die OnDraw-Memberfunktion in beiden Fällen aufgerufen wird, fügen Sie den Großteil des Zeichnungscodes in dieser Memberfunktion hinzu.

Die OnDraw-Memberfunktion steuern Zeichnen behandelt.Wenn ein Steuerelement inaktiv ist, ruft der Übergabe an OnDraw-Steuerelementcontainer und den Gerätekontext des Steuerelementcontainers und die Koordinaten des rechteckigen Bereichs, der durch das Steuerelement eingenommen wird.

Das Rechteck, das vom Framework OnDraw-Memberfunktion übergeben wird, enthält den Bereich, der durch das Steuerelement eingenommen wird.Wenn das Steuerelement aktiv ist, ist die obere linke Ecke (0, 0) und der übergebene Gerätekontext wird für das untergeordnete Fenster, das das Steuerelement enthält.Wenn das Steuerelement inaktiv ist, ist die linke obere Koordinate nicht unbedingt auf (0, 0) und den Gerätekontext, der übergeben wird, ist für den Steuerelementcontainer, die das Steuerelement enthält.

HinweisHinweis

Es ist wichtig, dass die Änderungen zu OnDraw nicht vom linke Punkt des Rechtecks abhängen, der gleich ist (0, 0) und dass Sie nur innerhalb des Rechtecks zeichnen, das an OnDraw übergeben wird.Unerwartete Ergebnisse können auftreten, wenn Sie über den Bereich des Rechtecks hinaus zeichnen.

Die Standardimplementierung, die aus dem MFC-ActiveX-Steuerelement-Assistenten in der .CPP) (implementierungsdatei Steuerelements bereitgestellt wird, unten dargestellt, zeichnet das Rechteck mit einem weißen Pinsel und füllt die Ellipse mit der aktuellen Hintergrundfarbe aus.

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

Wenn Sie ein Steuerelement zeichnen, sollten Sie Annahmen über den Zustand des Gerätekontext nicht ausführen, der als pdcOnDraw-Parameter an die Funktion übergeben wird.Gelegentlich wird der Gerätekontext durch die Containeranwendung angegeben und ist nicht unbedingt im Standardzustand initialisiert werden.Insbesondere, wählen Sie explizit die Stifte, die den Pinsel Farben, Schriftarten und andere Ressourcen aus, die das Zeichnen von Code nach abhängt.

Optimieren der Farben-Code

Nachdem das Steuerelement erfolgreich erfasst, besteht der nächste Schritt darin, die OnDraw-Funktion zu optimieren.

Die Standardimplementierung des ActiveX-Steuerelements Farben der gesamte Steuerelementbereich gezeichnet.Dies ist für einfache Steuerelemente, aber ausreichend In vielen Fällen kann das Steuerelement neu zu zeichnen, wenn nur der Teil, der das obligatorische Update neu gezeichnet wurde, anstatt des gesamten Steuerelements schneller sein.

Die OnDraw-Funktion stellt eine einfache Möglichkeit der Optimierung aus dem Übergeben von rcInvalid, der rechteckige Bereich des Steuerelements bereit, das das Neuzeichnen erfordert.Verwenden Sie diesen Bereich, normalerweise kleiner als der insgesamt Steuerelementbereich, um das Zeichnen zu beschleunigen.

Das Steuerelement zeichnet mithilfe von Metadateien

In den meisten Fällen zeigt der pdc-Parameter an die OnDraw-Funktion auf einem Bildschirm-Gerätekontext (DC).Wenn es während einer Steuerelements oder des Bilds eine Seitenansicht drucken, ist das DC, das zum Rendern empfangen wird, ein spezieller Typ, der einen "Metadatei-DC" bezeichnet wird.Im Gegensatz zu einem Bildschirm DC sofort verarbeitet, sandten Anforderungen darauf, ein Metadatei-DC speichert wiedergegeben, Anforderungen werden zu einem späteren Zeitpunkt.Einige Containeranwendungen können auch auswählen, um das Bild mithilfe eines Steuerelements gerendert werden soll, wenn Metadatei-DC im Entwurfsmodus.

zeichnungs - anforderungen können vom Container durch zwei Schnittstellenfunktionen gemacht werden: IViewObject::Draw (Diese Funktion kann nicht für Metadateien Zeichnung auch aufgerufen werden) und IDataObject::GetData.Wenn ein Metadatei-DC als Parameter übergeben wird, wird das MFC-Framework COleControl::OnDrawMetafile einen Aufruf.Da dies eine virtuelle Memberfunktion ist, überschreiben Sie diese Funktion in der Steuerelementklasse, um das eine spezielle Verarbeitung zu ermöglichen.Das Standardverhalten wird COleControl::OnDraw an.

Um sicherzustellen, kann sich das Steuerelement im Bildschirm gezeichnet und Metadatei gerätekontexte verwenden, müssen Sie nur Memberfunktionen in einen Bildschirm ein, und Metadatei-DC unterstützt werden.Beachten Sie, dass das Koordinatensystem möglicherweise nicht in Pixeln gemessen wird.

Da die Standardimplementierung von OnDrawMetafile die OnDraw-Funktion des Steuerelements aufruft, verwenden Sie nur Memberfunktionen, die für eine Metadatei und einen Bildschirm-Gerätekontext geeignet sind, es sei denn, Sie OnDrawMetafile überschreiben.Im Folgenden sind die Teilmenge von CDC-Memberfunktionen auf, die in einer Metadatei und in einem Bildschirm-Gerätekontext verwendet werden können.Weitere Informationen zu diesen Funktionen finden Sie CDC-Klasse in der MFC-Referenz.

Bögen

BibBlt

Sehne

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

 

Zusätzlich zu CDC-Memberfunktionen gibt es einige weitere Funktionen, die in einem Metadatei-DC kompatibel sind.Dazu gehören CPalette::AnimatePalette, CFont::CreateFontIndirect und dreiköpfige Funktionen von CBrush ein: CreateBrushIndirect, CreateDIBPatternBrush und CreatePatternBrush.

Funktionen, die nicht in einer Metadatei aufgezeichnet werden, sind: DrawFocusRect, DrawIcon, DrawText-, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC und TabbedTextOut.Da ein Metadatei-DC eigentlich nicht mit einem Gerät zugeordnet ist, können Sie SetDIBits, GetDIBits und CreateDIBitmap mit einem Metadatei-DC nicht verwenden.Sie können SetDIBitsToDevice und StretchDIBits mit einem Metadatei-DC als Ziel verwenden.CreateCompatibleDC, CreateCompatibleBitmap und CreateDiscardableBitmap sind nicht mit einem Metadatei-DC sinnvoll.

Ein anderer Stelle zu beachten, einen Metadatei-DC zu verwenden, besteht darin, dass das Koordinatensystem möglicherweise nicht in Pixeln gemessen wird.Aus diesem Grund sollte das gesamte Code zum Zeichnen auf Passung in das Rechteck angepasst werden, das OnDraw im rcBounds-Parameter übergeben wird.Dies verhindert versehentliches außerhalb des Steuerelements zu zeichnen, da rcBounds die Größe des Fensters des Steuerelements darstellt.

Nachdem Sie die Metadatei Rendering für das Steuerelement implementiert haben, verwenden Sie Testcontainer, um die Metadatei zu testen.Informationen zum Zugreifen auf den Testcontainer finden Sie unter Testen von Eigenschaften und Ereignissen mit dem Testcontainer.

Um die Metadatei des Steuerelements mithilfe des Testcontainers testen

  1. Zeigen Sie im Menü Bearbeiten des Testcontainers Klicken Sie auf Neues Steuerelement einfügen.

  2. Geben Sie im Feld Neues Steuerelement einfügen Wählen Sie das Steuerelement aus, und klicken Sie auf OK.

    Das Steuerelement wird im Testcontainer.

  3. Zeigen Sie im Menü Steuerelement Metadatei zeichnen.

    Ein separates Fenster wird in dem die Metadatei angezeigt wird.Sie können die Größe dieses Fensters geändert werden, um zu sehen, wie die Skalierung der Metadatei des Steuerelements auswirkt.Sie können dieses Fenster immer schließen.

Siehe auch

Konzepte

MFC-ActiveX-Steuerelemente