MFC-ActiveX-Steuerelemente: Erstellen einer Fenstersteuerelement-Unterklasse

In diesem Artikel wird der Prozess zum Unterklassen eines allgemeinen Windows-Steuerelements zum Erstellen eines ActiveX-Steuerelements beschrieben. Die Unterklassifizierung eines vorhandenen Windows-Steuerelements ist eine schnelle Möglichkeit zum Entwickeln eines ActiveX-Steuerelements. Das neue Steuerelement verfügt über die Fähigkeiten des unterklassigten Windows-Steuerelements, z. B. Zeichnen und Reagieren auf Mausklicks. Die Beispielschaltfläche für MFC-ActiveX-Steuerelemente ist ein Beispiel für die Unterklassifizierung eines Windows-Steuerelements.

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.

Führen Sie zum Unterklassen eines Windows-Steuerelements die folgenden Aufgaben aus:

Außerkraftsetzung von IsSubclassedControl und PreCreateWindow

Fügen Sie zum Überschreiben PreCreateWindow und IsSubclassedControlHinzufügen der folgenden Codezeilen zum protected Abschnitt der Steuerelementklassendeklaration hinzu:

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

In der Steuerelementimplementierungsdatei (. Fügen Sie die folgenden Codezeilen hinzu, um die beiden Außerkraftsetzungsfunktionen 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 PreCreateWindowangegeben ist. Standardmäßige Windows-Steuerelemente können jedoch unterklassigt werden. Weitere Informationen zu standardmäßigen Windows-Steuerelementen finden Sie unter "Steuerelemente".

Beim Unterklassen eines Windows-Steuerelements können Sie bestimmte Fensterformatvorlagen (WS_) oder erweiterte Fensterformatzeichen (WS_EX_) angeben, die beim Erstellen des Steuerelementfensters verwendet werden sollen. Sie können Werte für diese Parameter in der PreCreateWindow Memberfunktion festlegen, indem Sie die cs.style Felder und die cs.dwExStyle Strukturfelder ändern. Änderungen an diesen Feldern sollten mithilfe eines OR-Vorgangs vorgenommen werden, um die Standardkennzeichnungen beizubehalten, die von der Klasse COleControlfestgelegt werden. Wenn das Steuerelement beispielsweise das BUTTON-Steuerelement unterklassiert und das Steuerelement als Kontrollkästchen angezeigt werden soll, fügen Sie die folgende Codezeile in die Implementierung von CSampleCtrl::PreCreateWindow, vor der Rückgabe-Anweisung ein:

cs.style |= BS_CHECKBOX;

Bei diesem Vorgang wird das BS_CHECKBOX-Formatvorlagenflagge hinzugefügt, wobei das Standardformat-Flag (WS_CHILD) der Klasse COleControl intakt bleibt.

Ändern der OnDraw-Memberfunktion

Wenn Ihr Unterklassensteuerelement das gleiche Erscheinungsbild wie das entsprechende Windows-Steuerelement beibehalten soll, sollte die OnDraw Memberfunktion für das Steuerelement nur einen Aufruf der DoSuperclassPaint Memberfunktion 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 elementfunktion, implementiert von COleControl, verwendet die Fensterprozedur des Windows-Steuerelements, um das Steuerelement im angegebenen Gerätekontext innerhalb des umgebenden Rechtecks zu zeichnen. Dadurch wird das Steuerelement auch dann sichtbar, wenn es nicht aktiv ist.

Hinweis

Die DoSuperclassPaint Memberfunktion funktioniert nur mit den Steuerelementtypen, mit denen ein Gerätekontext als wParam einer WM_PAINT Nachricht übergeben werden kann. Dazu gehören einige der standardmäßigen Windows-Steuerelemente, z. B. BILDLAUFLEISTE und SCHALTFLÄCHE, sowie alle allgemeinen Steuerelemente. Für Steuerelemente, die dieses Verhalten nicht unterstützen, müssen Sie Ihren eigenen Code bereitstellen, um ein inaktives Steuerelement ordnungsgemäß anzuzeigen.

Behandeln von gespiegelten Fenstermeldungen

Windows-Steuerelemente senden in der Regel bestimmte Fenstermeldungen an das übergeordnete Fenster. Einige dieser Nachrichten, z. B. WM_COMMAND, stellen eine Benachrichtigung über eine Aktion des Benutzers bereit. Andere, z. B. WM_CTLCOLOR, werden verwendet, um Informationen aus dem übergeordneten Fenster abzurufen. Ein ActiveX-Steuerelement kommuniziert in der Regel mit dem übergeordneten Fenster auf andere Weise. Benachrichtigungen werden durch Auslösen von Ereignissen (Senden von Ereignisbenachrichtigungen) kommuniziert, und Informationen zum Steuerelementcontainer werden durch Den Zugriff auf die Umgebungseigenschaften des Containers abgerufen. Da diese Kommunikationstechniken vorhanden sind, werden von ActiveX-Steuerelementcontainern keine Fenstermeldungen verarbeitet, die vom Steuerelement gesendet werden.

Um zu verhindern, dass der Container die von einem Unterklassen-Windows-Steuerelement gesendeten Fensternachrichten empfängt, wird ein zusätzliches Fenster erstellt, COleControl das als übergeordnetes Element des Steuerelements fungiert. Dieses zusätzliche Fenster, das als "Reflektor" bezeichnet wird, wird nur für ein ActiveX-Steuerelement erstellt, das ein Windows-Steuerelement unterklassiert und dieselbe Größe und Position wie das Steuerelementfenster aufweist. Das Reflektorfenster fängt bestimmte Fenstermeldungen ab und sendet sie zurück an das Steuerelement. Das Steuerelement kann dann in seiner Fensterprozedur diese reflektierten Meldungen verarbeiten, indem aktionen ausgeführt werden, die für ein ActiveX-Steuerelement geeignet sind (z. B. auslösen eines Ereignisses). Eine Liste der abgefangenen Fensternachrichten und deren entsprechenden gespiegelten Nachrichten finden Sie unter "Gespiegelte Fensternachrichten" .

Ein ActiveX-Steuerelementcontainer kann so konzipiert sein, dass die Meldungsreflektion selbst ausgeführt wird, ohne dass das COleControl Reflektorfenster erstellt und der Laufzeitaufwand für ein unterklassiges Windows-Steuerelement reduziert wird. COleControl erkennt, ob der Container diese Funktion unterstützt, indem nach einer MessageReflect-Umgebungseigenschaft mit dem Wert TRUE gesucht wird.

Um eine reflektierte Fenstermeldung zu behandeln, fügen Sie der Steuerelementnachrichtenzuordnung einen Eintrag hinzu und implementieren sie eine Handlerfunktion. Da reflektierte Nachrichten nicht Teil des von Windows definierten Standardsatzes von Nachrichten sind, unterstützt die Klassenansicht das Hinzufügen solcher Nachrichtenhandler nicht. Es ist jedoch nicht schwierig, manuell einen Handler hinzuzufügen.

Gehen Sie wie folgt vor, um einen Nachrichtenhandler für eine reflektierte Fensternachricht hinzuzufügen:

  • In der Steuerelementklasse . H-Datei, deklarieren Sie eine Handlerfunktion. Die Funktion sollte einen Rückgabetyp von LRESULT und zwei Parametern aufweisen, mit den Typen WPARAM bzw . LPARAM. Beispiel:

    class CMyAxSubCtrl : public COleControl
    {
    
    protected:
       LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • In der Steuerelementklasse . Fügen Sie der Nachrichtenzuordnung einen ON_MESSAGE Eintrag hinzu. Die Parameter dieses Eintrags sollten der Nachrichtenbezeichner und der Name der Handlerfunktion sein. Beispiel:

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

Ein Beispiel dafür, wie reflektierte Nachrichten verarbeitet werden, finden Sie unter der Beispielschaltfläche für MFC ActiveX-Steuerelemente.For an example of how reflected messages are processed messages, refer to the MFC ActiveX controls sample BUTTON. Es veranschaulicht einen OnOcmCommand Handler, der den BN_CLICKED Benachrichtigungscode erkennt und reagiert, indem ein Click Ereignis ausgelöst (gesendet) wird.

Siehe auch

MFC ActiveX Controls (MFC-ActiveX-Steuerelemente)