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ßerkraftsetzen der IsSubclassedControl- und PreCreateWindow-Memberfunktionen von COleControl
Behandeln von ActiveX-Steuerelementmeldungen (OCM) für das Steuerelement
Hinweis
Viele dieser Aufgaben werden vom ActiveX-Steuerelement-Assistenten erledigt, wenn Sie das Steuerelement auswählen, das mithilfe der Dropdownliste "Übergeordnete Fensterklasse auswählen" auf der Seite "Steuerelement Einstellungen" untergeordnet werden soll.
Außerkraftsetzung von IsSubclassedControl und PreCreateWindow
Fügen Sie zum Überschreiben PreCreateWindow
und IsSubclassedControl
Hinzufü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 PreCreateWindow
angegeben 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 COleControl
festgelegt 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.