MFC-ActiveX-Steuerelemente: Erstellen von Unterklassen von einem Windows-Steuerelements

Dieser Artikel beschreibt den Prozess zum Unterordnen eines allgemeinen Windows-Steuerelements, um ein ActiveX-Steuerelement zu erstellen.Ein vorhandenes Windows-Steuerelement unterzuordnen ist eine schnelle Möglichkeit, ein ActiveX-Steuerelement zu entwickeln.Das neue Steuerelement ist auf die Fähigkeiten des untergeordneten Windows-Steuerelements, wie Zeichnen und Reagieren auf Mausklicks.Die Kontrollprobe MFC ActiveX BUTTON ist ein Beispiel für das Unterordnens des Windows-Steuerelements.

Um ein Windows-Steuerelement unterzuordnen, führen Sie die folgenden Aufgaben aus:

  • Überschreiben Sie die Memberfunktionen IsSubclassedControl und PreCreateWindow von COleControl

  • Ändern Sie die OnDraw-Memberfunktion

  • Bearbeiten Sie ggf. ActiveX-Steuerelement-Meldungen (OCM) übermittelt an das Steuerelement

    HinweisHinweis

    Ein Großteil der Arbeit wird vom ActiveX-Steuerelement-Assistenten automatisch ausgeführt, wenn Sie die mithilfe Übergeordnete Fensterklasse auswählen aus der Dropdownliste auf der Steuerelementeinstellungen Seite untergeordneten Steuerelements, werden soll.

Weitere Informationen finden Sie im Knowledge Base-Artikel Q243454 Weitere Informationen zum Unterordnen eines Steuerelements.

IsSubclassedControl und überschreiben PreCreateWindow

Um PreCreateWindow und IsSubclassedControl zu überschreiben, fügen Sie die folgenden Codezeilen dem protected-Steuerelementklassen Abschnitt der Deklaration hinzu:

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    BOOL IsSubclassedControl();

In der implementierungsdatei (.CPP) die folgenden Codezeilen hinzu, um die beiden überschriebenen Funktionen zu implementieren:

// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("BUTTON");
    return COleControl::PreCreateWindow(cs);
}

// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyAxSubCtrl::IsSubclassedControl()
{
    return TRUE;
}

Beachten Sie, dass in diesem Beispiel das Windows-Schaltflächen-Steuerelement in PreCreateWindow angegeben wird.Es können alle standardmäßigen windows-steuerelemente als Unterklasse definiert werden.Weitere Informationen zu standardmäßigen windows-steuerelemente finden Sie unter Steuerelemente.

Wenn Sie ein Windows-Steuerelement unterordnen, sollten Sie die zu verwendende Flags des Fensterstils (WS_EX_) Fensterstil bestimmten angeben (WS_) oder die erweiterten, wenn das Fenster des Steuerelements erstellen.Sie können die Werte für diese Parameter in der PreCreateWindow-Memberfunktion, indem Sie cs.style und die Struktur cs.dwExStyle Felder ändern.Änderungen an diesen Feldern sollten unter Verwendung eines OR Vorgangs gemacht werden, um die Flags für standardmäßige Verwaltung von Klasse COleControl festgelegt werden.Wenn z. B. das Steuerelement das Schaltflächen-Steuerelement unterordnet und Sie das Steuerelement als ein Kontrollkästchen angezeigt werden sollen, fügen Sie die folgende Codezeile in die Implementierung von CSampleCtrl::PreCreateWindow, bevor die return-Anweisung Folgendes ein:

cs.style |= BS_CHECKBOX;

Dieser Vorgang wird im BS_CHECKBOX Format hinzu flag beim Festlegen des Standardstil Flags (WS_CHILD) der Klasse COleControl intakt.

Die OnDraw-Memberfunktion ändern

Wenn Sie ein untergeordnetes Steuerelement die gleiche Darstellung wie das entsprechende Windows-Steuerelement halten möchten, sollte die OnDraw-Memberfunktion für das Steuerelement nur ein Aufruf der Memberfunktion DoSuperclassPaint enthalten, wie im folgenden Beispiel gezeigt:

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

    DoSuperclassPaint(pdc, rcBounds);
}

Die DoSuperclassPaint-Memberfunktion, implementiert COleControl verwendet, um die Fensterprozedur des Windows-Steuerelements, um das Steuerelement im angegebenen Gerätekontext, innerhalb des umgebenden Rechtecks zu zeichnen.Dadurch wird das Steuerelement sichtbar, auch wenn es nicht aktiv ist.

HinweisHinweis

Die DoSuperclassPaint-Memberfunktion funktioniert nur mit diesen Steuerelementtypen, die einen als ermöglichen wParam einer WM_PAINT Meldung zu übergebenden Gerätekontext.Dies schließt einige der Standardwert windows-steuerelemente, wie SCROLLBAR Allgemeine Steuerelemente, und alle SCHALTFLÄCHE und ein.Für Steuerelemente, die dieses Verhalten nicht unterstützen, müssen Sie eigenen Code bereitstellen, um ein inaktives Steuerelement ordnungsgemäß angezeigt wird.

Reflektierte behandeln Fenster-Meldungen

Windows-Steuerelemente senden in der Regel spezifische Fenstermeldung zum übergeordneten Fenster.Einige dieser Meldungen, z. B. WM_COMMAND, stellen Benachrichtigung einer Aktion vom Benutzer bereit.Andere, z WM_CTLCOLOR verwendet werden, um Informationen aus dem übergeordneten Fenster zu erhalten.Ein ActiveX-Steuerelement ist normalerweise das übergeordnete Fenster auf andere Ressourcen verbunden.Benachrichtigungen werden übermittelt, indem die Ereignisse (Ereignisbenachrichtigungen zu senden) auslöst, und Informationen über den Steuerelementcontainer werden durch Festlegen der Ambient-Eigenschaften des Containers zugegriffen wird.Da diese Kommunikations techniken vorhanden sind, sind ActiveX-Steuerelement-Container erwartet, dass keine Fenstermeldungen verarbeitet, die durch das Steuerelement gesendet werden.

Um zu verhindern, dass der Container die Fenstermeldungen empfängt, die durch ein untergeordnetes Windows-Steuerelement gesendet werden, COleControl erstellt ein zusätzliches Fenster als das übergeordnete Element des Steuerelements verwendet werden.Dieser zusätzliche Fenster, die als "Reflektor," wird nur für ein ActiveX-Steuerelement erstellt, der ein Windows-Steuerelement unterordnet und dieselbe Größe und die Position des Steuerelements als Fenster hat.Die abfang bestimmten Fenster Reflektor Fenstermeldungen und sendet sie zurück zum Steuerelement.Das Steuerelement, in dessen Fensterprozedur, kann diese reflektierten Meldungen verarbeiten dann mithilfe der Aktion ausführt, die für ein ActiveX-Steuerelement äquivalent sind (z. B. ein Ereignis Auslösen von Ereignissen).Weitere Informationen finden Sie unter Reflektierte Fenster-Meldungs-ID für eine Liste von abgefangenen Fenstermeldungen und ihre entsprechenden reflektierten Meldungen.

Ein ActiveX-Steuerelement-Container wurde entworfen, um Reflektion Nachrichten selbst durchzuführen, entfällt die Notwendigkeit, damit COleControl das Fenster erstellt Reflektor und reduziert die Ablaufzeit für ein untergeordnetes mehraufwand Windows-Steuerelement.COleControl erkennt, ob der Container dieses Feature unterstützt, indem er für eine MessageReflect-Ambient-Eigenschaft mit dem Wert TRUE überprüft.

Um eine reflektierte Fenstermeldung zu ändern, fügen Sie einen Eintrag in einer Zuordnung Steuerelementmeldungs hinzu und implementieren Sie eine Handlerfunktion.Da reflektierte Meldungen nicht Teil des Standardsatz von der Meldungen sind, die von Windows definierten Klassenansicht unterstützt nicht das Hinzufügen von Meldungshandler.Allerdings ist es schwierig, einen Handler manuell hinzuzufügen.

Um einen Meldungshandler für eine reflektierte Fenstermeldung manuell hinzuzufügen gehen Sie wie folgt vor:

  • In der Steuerelementklasse. .h-Datei deklariert eine Handlerfunktion, oder legt diesen fest.Die Funktion muss einen Rückgabetyp LRESULT und zwei Parameter, mit WPARAM-Typen und LPARAM haben.Beispiele:

    class CMyAxSubCtrl : public COleControl
    {
    
    
    ...
    
    
    protected:
        LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • In der Steuerelementklassen cpp-datei fügen Sie einen ON_MESSAGE Eintrag zur Meldungszuordnung hinzu.Die Parameter dieses Eintrags sollten die Meldungs-ID und Name der Handlerfunktion sein.Beispiele:

    BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl)
        ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand)
    END_MESSAGE_MAP()
    
  • Auch in der CPP-Datei, implementieren Sie die OnOcmCommand-Memberfunktion, um die reflektierte Meldung zu verarbeiten.Die wParam und lParam-Parameter sind identisch mit denen der ursprünglichen Fenstermeldung.

Ein Beispiel dafür, wie reflektierte Meldungen verarbeitet werden, finden Sie in der Kontrollprobe MFC ActiveX BUTTON an.Es wird ein OnOcmCommand-Handler, der den BN_CLICKED Benachrichtigungscode erkennt und reagiert, indem (Submit) ein Klickereignis ausgelöst wird.

Siehe auch

Konzepte

MFC-ActiveX-Steuerelemente