Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird der Prozess zum Subklassifizieren eines Standard-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.
Von Bedeutung
ActiveX ist eine ältere Technologie, die nicht für die neue Entwicklung verwendet werden sollte. Weitere Informationen zu modernen Technologien, die ActiveX ersetzen, finden Sie unter ActiveX-Steuerelemente.
Führen Sie zum Unterklassen eines Windows-Steuerelements die folgenden Aufgaben aus:
Behandeln Sie alle ActiveX-Steuermeldungen (OCM), die an das Steuerelement gesendet werden
Hinweis
Viele dieser Aufgaben werden von dem ActiveX-Steuerelement-Assistenten erledigt, wenn Sie auf der Seite "Steuerelementeinstellungen" das Steuerelement auswählen, das unterklassigt werden soll, indem Sie die Dropdownliste "Übergeordnete Fensterklasse auswählen" verwenden.
Überschreiben von IsSubclassedControl und PreCreateWindow
Um PreCreateWindow und IsSubclassedControl zu überschreiben, fügen Sie die folgenden Codezeilen in den protected-Abschnitt der Steuerelementklassendeklaration ein:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
In der Steuerelementimplementierungsdatei (.CPP) fügen Sie 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 PreCreateWindowangegeben ist. Standardmäßige Windows-Steuerelemente können jedoch untergeordnet werden. Weitere Informationen zu standardmäßigen Windows-Steuerelementen finden Sie unter "Steuerelemente".
Wenn Sie ein Windows-Steuerelement unterklassifizieren, möchten Sie möglicherweise bestimmte Flags für den Fensterstil (WS_) oder den erweiterten Fensterstil (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 SCHALTFLÄCHENSTEUERELEMENT subklassiert und Sie möchten, dass das Steuerelement als Kontrollkästchen angezeigt wird, fügen Sie die folgende Codezeile in die Implementierung von CSampleCtrl::PreCreateWindowvor der Rückgabeanweisung ein:
cs.style |= BS_CHECKBOX;
Im Zuge dieses Vorgangs wird die BS_CHECKBOX-Stilflagge hinzugefügt, während die Standard-Stilflagge (WS_CHILD) der Klasse COleControl beibehalten wird.
Ändern der OnDraw-Mitgliedsfunktion
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 vonCOleControl, verwendet die Fensterprozedur des Windows-Steuerelements, um das Steuerelement im angegebenen Gerätekontext innerhalb des Begrenzungsrechtecks zu zeichnen. Dadurch wird das Steuerelement auch dann sichtbar, wenn es nicht aktiv ist.
Hinweis
Die DoSuperclassPaint Member-Funktion funktioniert nur mit den Steuertypen, mit denen ein Gerätekontext als wParam einer WM_PAINT -Nachricht übergeben werden kann. Dazu gehören einige der Standard-Windows-Steuerelemente, wie z. B. die BILDLAUFLEISTE und DIE SCHALTFLÄCHE, sowie alle gängigen 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 reflektierten 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, wie WM_CTLCOLOR, werden verwendet, um Informationen aus dem übergeordneten Fenster zu erhalten. Ein ActiveX-Steuerelement kommuniziert in der Regel mit dem übergeordneten Fenster auf anderen Wegen. Benachrichtigungen werden durch das Auslösen von Ereignissen (Senden von Ereignisbenachrichtigungen) kommuniziert, und Informationen über den Kontrollcontainer werden durch den Zugriff auf die Umgebungseigenschaften des Containers erhalten. 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 ihrer entsprechenden gespiegelten Nachrichten-IDs finden Sie unter Reflektierte Fensternachrichten-IDs.
Ein ActiveX-Steuerelementcontainer kann so konzipiert sein, dass er die Meldungsreflexion selbst übernimmt, wodurch die Notwendigkeit entfällt, dass COleControl das Reflektorfenster erstellt, und der Laufzeitaufwand für ein spezialisiertes Windows-Steuerelement verringert 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 verarbeiten, fügen Sie einen Eintrag zur Steuermeldungszuordnung 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); };Fügen Sie in der Datei Steuerklasse .CPP der Nachrichtenzuordnung einen Eintrag ON_MESSAGE 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()Implementieren Sie auch in der .CPP-DATEI die Funktion
OnOcmCommandmember zur Verarbeitung der reflektierten Nachricht. Die Parameter "wParam " und "lParam " entsprechen denen der ursprünglichen Fenstermeldung.
Ein Beispiel dafür, wie reflektierte Nachrichten verarbeitet werden, finden Sie im MFC ActiveX-Steuerelemente-Beispiel BUTTON. Es veranschaulicht einen OnOcmCommand Handler, der den BN_CLICKED Benachrichtigungscode erkennt und reagiert, indem ein Click Ereignis ausgelöst (gesendet) wird.