MFC-ActiveX-Steuerelemente: Erstellen einer Fenstersteuerelement-Unterklasse
Dieser Artikel beschreibt den Prozess zum Erstellen von Unterklassen von einem allgemeinen Windows-Steuerelements, um ein ActiveX-Steuerelement zu erstellen. Ein vorhandenes Windows-Steuerelement unterzuordnen ist eine schnelle Möglichkeit, ein ActiveX-Steuerelement entwickeln. Das neue Steuerelement verfügt die Fähigkeiten des Windows-Steuerelements untergeordneten, wie Zeichnen und Reagieren auf Mausklicks. Die Kontrollprobe MFC ActiveX SCHALTFLÄCHE ist ein Beispiel für Unterordnens eines 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 alle ActiveX-Steuerelement-Meldungen (OCM) übermittelt an das Steuerelement
Hinweis
Ein Großteil dieser Arbeit wird für Sie im ActiveX-Steuerelement-Assistenten ausgegeben, wenn Sie das mit aus der Dropdownliste Übergeordnete Fensterklasse auswählen auf der Seite Steuerelementeinstellungen als Unterklasse definiert werden, Steuerelement.
finden Sie im Knowledge Base-Artikel Q243454 zu Informationen zum Erstellen von Unterklassen von einem Steuerelement.
Überschreiben von IsSubclassedControl und von PreCreateWindow
Um PreCreateWindow und IsSubclassedControl zu überschreiben, fügen Sie die folgenden Codezeilen im Abschnitt protected der Steuerelementklassendeklaration hinzu:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
In der Steuerimplementierungsdatei (.CPP), fügen Sie die folgenden Codezeilen hinzu, um die zwei ü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 Schaltflächen-Steuerelement von Windows in PreCreateWindow angegeben wird. Sie können jedoch alle Standardwindows-steuerelemente als Unterklasse definiert werden. Weitere Informationen über Standardwindows-steuerelemente, finden Sie unter Steuerelemente.
Wenn Sie ein Windows-Steuerelement, können Sie bestimmten Fensterstil (WS_ angeben möchten unterordnen oder erweiterter Fensterstil (WS_EX_) kennzeichnet, verwendet werden, wenn das Fenster des Steuerelements erstellt. Sie können die Werte für diese Parameter in der Memberfunktion PreCreateWindow, indem Sie cs.style und die cs.dwExStyle-Strukturfelder ändern. Änderungen an diesen Feldern sollten unter Verwendung eines OR - Vorgangs erstellt werden, um die Standardflags beizubehalten, die durch COleControl- Klasse festgelegt werden. Wenn das Steuerelement das Schaltflächen-Steuerelement als Unterklasse festlegt und Sie das Steuerelement als Kontrollkästchen angezeigt werden soll, die folgende Codezeile in die Implementierung von CSampleCtrl::PreCreateWindow, vor der return-Anweisung ein:
cs.style |= BS_CHECKBOX;
Dieser Vorgang fügt das BS_CHECKBOX Formatflag hinzu, während die Deckkraft des Standardstilflags (WS_CHILD) der COleControl-Klasse erhalten.
Ändern der OnDraw-Memberfunktion
Wenn Sie ein untergeordnetes Steuerelement die gleiche Darstellung wie das entsprechende Windows-Steuerelement halten möchten, sollte die Memberfunktion OnDraw für das Steuerelement nur einen Aufruf der Memberfunktion DoSuperclassPaint, wie im folgenden Beispiel enthalten:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
Die Memberfunktion DoSuperclassPaint, implementiert durch COleControl, verwendet die Fensterprozedur des Windows-Steuerelements, um das Steuerelement im angegebenen Gerätekontext, innerhalb des umgebenden Rechtecks zu zeichnen. Dadurch wird das Steuerelement angezeigt erstellt, wenn es nicht aktiv ist.
Hinweis
Die Memberfunktion DoSuperclassPaint funktioniert nur mit diesen Steuerelementtypen, die einen als wParam ermöglichen eine WM_PAINT Meldung übergeben werden Gerätekontext.Dies schließt einige der Standardwindows-steuerelemente, wie BILDLAUFLEISTE und SCHALTFLÄCHE alle gängigen Steuerelementen ein.Für Steuerelemente, die dieses Verhalten nicht unterstützen, müssen Sie einen eigenen Code bereitstellen, um ein Steuerelement ordnungsgemäß Präprozessordirektiven anzuzeigen.
Behandeln von Fenster-Meldungen reflektierten
Windows-Steuerelemente senden in der Regel bestimmte Fenstermeldungen zum übergeordneten Fenster. Einige dieser Meldungen, wie WM_COMMAND, erstellen Benachrichtigung über eine Aktion vom Benutzer. Andere, wie WM_CTLCOLOR, werden verwendet, um Informationen im übergeordneten Fenster abzurufen. Ein ActiveX-Steuerelement ist normalerweise das übergeordnete Fenster durch andere Mittel kommunizieren. Benachrichtigungen werden übermittelt, indem die Ereignisse (Ereignisbenachrichtigungen zu senden) auslöst, und Informationen über den Steuerelementcontainer werden abgerufen, indem mit der Ambient-Eigenschaften des Containers zugreift. Da diese Kommunikationstechniken bestehen, werden ActiveX-Steuerelementcontainer erwartet, keine Fenstermeldungen zu verarbeiten, die das Steuerelement sendet werden.
Um zu verhindern dass der Container die Fenstermeldungen empfängt, die ein untergeordnetes Windows-Steuerelement COleControl gesendet werden, wird ein zusätzliches Fenster das als das übergeordnete Element des Steuerelements verwendet werden. Auf zusätzliche Fenster, einen Reflektor aufgerufen "," wird nur für ein ActiveX-Steuerelement erstellt, der ein Windows-Steuerelement als Unterklasse festlegt und die gleiche Größe und die Position als das Steuerfenster hat. Die Reflektorfensterabfangbestimmten Fenstermeldungen und sendet sie zurück zum Steuerelement. Das Steuerelement, in der Fensterprozedur, kann diese reflektierten Meldungen dann verarbeiten, indem die Aktion durchführt, die für ein ActiveX-Steuerelement entsprechen (beispielsweise, ein Ereignis auszulösen). Reflektierte Fenster-Meldungs-IDs finden Sie eine Liste der abgefangenen Fenstermeldungen und ihrer entsprechenden reflektierten Meldungen.
Ein ActiveX-Steuerelementcontainer ist entworfen werden, um Meldungsreflektion selbst auszuführen, entfällt die Notwendigkeit, damit COleControl das Reflektorfenster erstellt und reduziert den Aufwand zur Laufzeit für ein untergeordnetes Windows-Steuerelement. COleControl erkennt, dass der Container die Funktion unterstützt wird, indem er für eine MessageReflect-Ambient-Eigenschaft mit einem Wert TRUE überprüft.
Um eine reflektierte Fenstermeldung bearbeiten, fügen Sie einen Eintrag der Steuerelementmeldungszuordnung hinzu und implementieren Sie eine Handlerfunktion. Da reflektierte Meldungen nicht Teil des Standardsatzes der Meldungen sind, die von Windows definiert werden, unterstützt Klassenansicht nicht das Hinzufügen solcher Meldungshandler. Es ist jedoch nicht schwierig, einen Handler manuell hinzuzufügen.
Um einen Meldungshandler für eine reflektierte Fenstermeldung manuell hinzuzufügen führen Sie Folgendes:
In der Steuerelementklasse. H-Datei, deklarieren eine Handlerfunktion. Die Funktion sollte einen Rückgabetyp und LRESULT zwei Parameter, mit Typen WPARAM und LPARAM verfügen, bzw. Beispiel:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
In der Steuerelementklassencpp-datei fügen Sie einen Eintrag der Meldungszuordnung ON_MESSAGE hinzu. Die Parameter dieses Eintrags sollten die Nachricht und der Name der Handlerfunktion sein. Beispiel:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Auch in der CPP-Datei, implementieren die OnOcmCommand-Memberfunktion, um die reflektierte Meldung zu verarbeiten. Die wParam und lParam-Parameter sind mit denen identisch der ursprünglichen Fenstermeldung.
Ein Beispiel, wie reflektierte Meldungen verarbeitet werden, können Sie die Kontrollprobe MFC ActiveX SCHALTFLÄCHE. Es zeigt einen Handler, den OnOcmCommand der BN_CLICKED Benachrichtigungscode erkennt und reagiert, indem es (Senden) ein Klickereignis ausgelöst.