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 OnDraw
das 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
Klicken Sie im Menü "Bearbeiten" des Testcontainers auf "Neues Steuerelement einfügen".
Wählen Sie im Feld "Neues Steuerelement einfügen" das Steuerelement aus, und klicken Sie auf "OK".
Das Steuerelement wird im Testcontainer angezeigt.
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.