MFC-ActiveX-Steuerelemente: Darstellen eines ActiveX-Steuerelements

In diesem Artikel wird der Prozess zum Zeichnen von ActiveX-Steuerelementen beschrieben und beschrieben, wie Sie den Farbcode ändern können, um den Prozess zu optimieren. (Siehe Optimieren der Steuerelementzeichnung für Techniken zum Optimieren der Zeichnung, indem keine Steuerelemente einzeln ausgewählte GDI-Objekte wiederhergestellt werden. Nachdem alle Steuerelemente gezeichnet wurden, kann der Container die ursprünglichen Objekte automatisch wiederherstellen.)

Wichtig

ActiveX ist eine Legacytechnologie, die nicht für neue Software verwendet werden sollte. Weitere Informationen zu modernen Technologien, die ActiveX ablösen, finden Sie unter ActiveX-Steuerelemente.

Beispiele in diesem Artikel stammen aus einem Steuerelement, das vom MFC ActiveX-Steuerelement-Assistenten mit Standardeinstellungen erstellt wurde. Weitere Informationen zum Erstellen einer Skelettsteuerelementanwendung mit dem MFC ActiveX-Steuerelement-Assistenten finden Sie im Artikel MFC ActiveX Control Wizard.

Die folgenden Themen werden behandelt:

Der Zeichnungsprozess eines ActiveX-Steuerelements

Wenn ActiveX-Steuerelemente anfänglich angezeigt oder neu gezeichnet werden, folgen sie einem Malprozess ähnlich wie bei anderen Anwendungen, die mit MFC entwickelt wurden, mit einem wichtigen Unterschied: ActiveX-Steuerelemente können sich in einem aktiven oder inaktiven Zustand befinden.

Ein aktives Steuerelement wird in einem ActiveX-Steuerelementcontainer durch ein untergeordnetes Fenster dargestellt. Wie bei anderen Fenstern ist sie für das Zeichnen selbst verantwortlich, wenn eine WM_PAINT Nachricht empfangen wird. Die Basisklasse des Steuerelements, COleControl, behandelt diese Nachricht in ihrer OnPaint Funktion. Diese Standardimplementierung ruft die OnDraw Funktion Ihres Steuerelements auf.

Ein inaktives Steuerelement wird anders gezeichnet. Wenn das Steuerelement inaktiv ist, ist das Fenster entweder unsichtbar oder nicht vorhanden, sodass es keine Paint-Nachricht empfangen kann. Stattdessen ruft der Steuerelementcontainer die OnDraw Funktion des Steuerelements direkt auf. Dies unterscheidet sich von dem Malprozess eines aktiven Steuerelements darin, dass die OnPaint Memberfunktion nie aufgerufen wird.

Wie in den vorherigen Absätzen erläutert, hängt die Aktualisierung eines ActiveX-Steuerelements vom Status des Steuerelements ab. Da das Framework jedoch die OnDraw Memberfunktion in beiden Fällen aufruft, fügen Sie den Großteil des Zeichencodes in dieser Memberfunktion hinzu.

Die OnDraw Memberfunktion behandelt das Zeichnen von Steuerelementen. Wenn ein Steuerelement inaktiv ist, ruft der Steuerelementcontainer auf OnDraw, übergibt den Gerätekontext des Steuerelementcontainers und die Koordinaten des rechteckigen Bereichs, der vom Steuerelement belegt wird.

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

Hinweis

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

Die Standardimplementierung, die vom MFC ActiveX-Steuerelement-Assistenten in der Steuerelementimplementierungsdatei (. CPP), unten dargestellt, zeichnet das Rechteck mit einem weißen Pinsel und füllt die Auslassungspunkte mit der aktuellen Hintergrundfarbe.

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

Hinweis

Beim Zeichnen eines Steuerelements sollten Sie keine Annahmen über den Zustand des Gerätekontexts treffen, der als pdc-Parameter an die OnDraw Funktion übergeben wird. Gelegentlich wird der Gerätekontext von der Containeranwendung bereitgestellt und nicht unbedingt in den Standardzustand initialisiert. Wählen Sie insbesondere explizit die Stifte, Pinsel, Farben, Schriftarten und andere Ressourcen aus, von denen Ihr Zeichencode abhängt.

Optimieren des Paint-Codes

Nachdem das Steuerelement erfolgreich selbst bereinigt wurde, besteht der nächste Schritt darin, die OnDraw Funktion zu optimieren.

Die Standardimplementierung von ActiveX-Steuerelementlackierung zeichnet den gesamten Steuerelementbereich. Dies reicht für einfache Steuerelemente aus, aber in vielen Fällen wäre die Aktualisierung des Steuerelements schneller, wenn nur der teil, der aktualisiert werden musste, anstelle des gesamten Steuerelements.

Die OnDraw Funktion bietet eine einfache Optimierungsmethode, indem rcInvalid übergeben wird, der rechteckige Bereich des Steuerelements, das neu gezeichnet werden muss. Verwenden Sie diesen Bereich, in der Regel kleiner als der gesamte Kontrollbereich, um den Lackiervorgang zu beschleunigen.

Zeichnen Ihres Steuerelements mithilfe von Metadateien

In den meisten Fällen verweist der pdc-Parameter auf die OnDraw Funktion auf einen Bildschirmgerätekontext (DC). Beim Drucken von Bildern des Steuerelements oder während einer Druckvorschausitzung ist der für das Rendering empfangene DC jedoch ein spezieller Typ namens "metafile DC". Im Gegensatz zu einem Bildschirm-DC, der sofort an den Computer gesendete Anforderungen verarbeitet, speichert eine Metadatei Anforderungen, die zu einem späteren Zeitpunkt wiedergegeben werden sollen. Einige Containeranwendungen können sich auch dafür entscheiden, das Steuerelementimage mithilfe einer Metadatei DC im Entwurfsmodus zu rendern.

Metafile-Zeichnungsanforderungen können vom Container über zwei Schnittstellenfunktionen vorgenommen werden: IViewObject::Draw (diese Funktion kann auch für nicht-metafile-Zeichnung aufgerufen werden) und IDataObject::GetData. Wenn eine Metadatei DC als einen der Parameter übergeben wird, führt das MFC-Framework einen Aufruf von COleControl::OnDrawMetafile durch. Da es sich um eine virtuelle Memberfunktion handelt, überschreiben Sie diese Funktion in der Steuerelementklasse, um eine spezielle Verarbeitung durchführen zu können. Das Standardverhalten ruft auf COleControl::OnDraw.

Um sicherzustellen, dass das Steuerelement sowohl im Bildschirm- als auch im Metafile-Gerätekontext gezeichnet werden kann, müssen Sie nur Memberfunktionen verwenden, die sowohl in einem Bildschirm als auch in einer Metadatei DC unterstützt werden. Beachten Sie, dass das Koordinatensystem möglicherweise nicht in Pixel gemessen wird.

Da die Standardimplementierung der Funktion des OnDrawMetafile Steuerelements OnDraw aufruft, verwenden Sie nur Memberfunktionen, die sowohl für eine Metadatei als auch für einen Bildschirmgerätekontext geeignet sind, es sei denn, Sie überschreiben OnDrawMetafile. Im Folgenden werden die Teilmenge der CDC Memberfunktionen aufgeführt, die sowohl in einer Metadatei als auch in einem Bildschirmgerätekontext verwendet werden können. Weitere Informationen zu diesen Funktionen finden Sie im Klassen-CDC in der MFC-Referenz.

Arc BibBlt Akkord
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 mehrere andere Funktionen, die in einer Metadatei DC kompatibel sind. Dazu gehören CPalette::AnimatePalette, CFont::CreateFontIndirect und drei Memberfunktionen von CBrush: 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 eine Metadatei DC nicht tatsächlich einem Gerät zugeordnet ist, können Sie SetDIBits, GetDIBits und CreateDIBitmap nicht mit einer Metadatei DC verwenden. Sie können SetDIBitsToDevice und StretchDIBits mit einer Metadatei DC als Ziel verwenden. CreateCompatibleDC, CreateCompatibleBitmap und CreateDis Karte ableBitmap sind mit einer Metadatei DC nicht aussagekräftig.

Ein weiterer Punkt, der bei der Verwendung einer Metadatei DC berücksichtigt werden muss, ist, dass das Koordinatensystem möglicherweise nicht in Pixel gemessen wird. Aus diesem Grund sollte der gesamte Zeichnungscode so angepasst werden, dass es in das Rechteck passt, das an den rcBounds-Parameter übergeben wirdOnDraw. Dies verhindert das versehentliche Zeichnen außerhalb des Steuerelements, da rcBounds die Größe des Steuerelementfensters darstellt.

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

So testen Sie die Metadatei des Steuerelements mithilfe des Testcontainers

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

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

    Das Steuerelement wird im Testcontainer angezeigt.

  3. Klicken Sie im Menü "Steuerelement " auf "Metadatei zeichnen".

    Ein separates Fenster wird angezeigt, in dem die Metadatei angezeigt wird. Sie können die Größe dieses Fensters ändern, um zu sehen, wie sich die Skalierung auf die Metadatei des Steuerelements auswirkt. Sie können dieses Fenster jederzeit schließen.

Siehe auch

MFC ActiveX Controls (MFC-ActiveX-Steuerelemente)