ActiveX-Steuerelemente für das Internet
ActiveX-Steuerelemente sind die aktualisierte Version der OLE-Steuerelementspezifikation.
Wichtig
ActiveX ist eine Legacytechnologie, die nicht für neue Software verwendet werden sollte. Weitere Informationen finden Sie unter ActiveX-Steuerelemente.
Steuerelemente sind eine primäre Architektur für die Entwicklung programmierbarer Softwarekomponenten, die in einer Vielzahl verschiedener Container verwendet werden können, einschließlich COM-fähigen Webbrowsern im Internet. Jedes ActiveX-Steuerelement kann ein Internetsteuerelement sein und seine Funktionalität einem aktiven Dokument hinzufügen oder Teil einer Webseite sein. Steuerelemente auf einer Webseite können mithilfe von Skripts miteinander kommunizieren.
ActiveX-Steuerelemente sind nicht auf das Internet beschränkt. Ein ActiveX-Steuerelement kann auch in jedem Container verwendet werden, solange das Steuerelement die schnittstellen unterstützt, die für diesen Container erforderlich sind.
ActiveX-Steuerelemente haben mehrere Vorteile, darunter:
Weniger erforderliche Schnittstellen als vorherige OLE-Steuerelemente.
Die Möglichkeit, fensterlos und immer aktiv zu sein.
Um ein ActiveX-Steuerelement zu sein, muss ein Steuerelement:
Unterstützen Sie die
IUnknown
Schnittstelle.Ein COM-Objekt sein.
Exportieren Sie DLLRegisterServer und DLLUnRegisterServer.
Unterstützen Sie bei Bedarf zusätzliche Schnittstellen für die Funktionalität.
Machen Sie Ihre vorhandenen Steuerelemente internetfreundlich
Das Entwerfen eines Steuerelements, das in einer Internetumgebung gut funktioniert, erfordert eine Berücksichtigung der relativ niedrigen Übertragungsraten im Internet. Sie können ihre vorhandenen Steuerelemente verwenden; Es gibt jedoch Schritte, die Sie ausführen sollten, um die Codegröße zu verkleineren und die Steuerelementeigenschaften asynchron herunterzuladen.
Um die Leistung Ihrer Steuerelemente zu verbessern, befolgen Sie die folgenden Tipps zu Effizienzaspekten:
Implementieren Sie die im Artikel ActiveX-Steuerelemente: Optimierung beschriebenen Techniken.
Überlegen Sie, wie ein Steuerelement instanziiert wird.
Asynchron sein; andere Programme nicht halten.
Laden Sie Daten in kleinen Blöcken herunter.
Beim Herunterladen großer Datenströme wie Bitmaps oder Videodaten greifen Sie asynchron in Zusammenarbeit mit dem Container auf die Daten eines Steuerelements zu. Rufen Sie die Daten inkrementeller oder progressiver Weise ab, und arbeiten Sie kooperativ mit anderen Steuerelementen zusammen, die auch Daten abrufen können. Code kann auch asynchron heruntergeladen werden.
Laden Sie Code und Eigenschaften im Hintergrund herunter.
Werden Sie so schnell wie möglich zur Benutzeroberfläche aktiv.
Überlegen Sie, wie persistente Daten gespeichert werden, sowohl Eigenschaften als auch BLOBs für große Daten (z. B. Bitmapbild- oder Videodaten).
Steuerelemente mit erheblichen Mengen persistenter Daten, z. B. große Bitmaps oder AVI-Dateien, erfordern sorgfältige Aufmerksamkeit beim Herunterladen der Methode. Ein Dokument oder eine Seite kann so schnell wie möglich sichtbar werden und dem Benutzer ermöglichen, mit der Seite zu interagieren, während Steuerelemente Daten im Hintergrund abrufen.
Schreiben Sie effiziente Routinen, um die Codegröße und die Laufzeit nach unten zu halten.
Kleine Schaltflächen- und Bezeichnungssteuerelemente mit nur wenigen Bytes persistenter Daten eignen sich für die Verwendung in der Internetumgebung und funktionieren gut in Browsern.
Bedenken Sie, dass der Fortschritt an den Container kommuniziert wird.
Benachrichtigen Sie den Container über den Fortschritt im asynchronen Download, einschließlich des Zeitpunkts, an dem der Benutzer mit der Interaktion mit einer Seite beginnen kann, und wenn der Download abgeschlossen ist. Der Container kann den Fortschritt (z. B. "Prozent abgeschlossen") für den Benutzer anzeigen.
Überlegen Sie, wie Steuerelemente auf dem Clientcomputer registriert werden.
Erstellen eines neuen ActiveX-Steuerelements
Beim Erstellen eines neuen Steuerelements mithilfe des Anwendungs-Assistenten können Sie die Unterstützung für asynchrone Moniker sowie andere Optimierungen aktivieren. Führen Sie die folgenden Schritte aus, um Unterstützung zum asynchronen Herunterladen von Steuerelementeigenschaften hinzuzufügen:
So erstellen Sie Ihr Projekt mithilfe des MFC ActiveX-Steuerelement-Assistenten
Klicken Sie im Menü "Datei" auf "Neu".
Wählen Sie den MFC ActiveX-Steuerelement-Assistenten aus den Visual Studio C++-Projekten aus, und nennen Sie Ihr Projekt.
Wählen Sie auf der Seite "Steuerelement Einstellungen" die Option "Lädt"-Eigenschaften asynchron aus. Wenn Sie diese Option auswählen, wird die Eigenschaft "Ready State" und das "Ready State Changed"-Ereignis für Sie eingerichtet.
Sie können auch andere Optimierungen auswählen, z . B. die Aktivierung ohne Fenster, die in ActiveX-Steuerelementen beschrieben wird: Optimierung.
Klicken Sie auf Fertig stellen, um das Projekt zu erstellen.
So erstellen Sie eine von CDataPathProperty abgeleitete Klasse
Erstellen Sie eine von
CDataPathProperty
.Fügen Sie in jeder Ihrer Quelldateien, die die Headerdatei für Ihr Steuerelement enthalten, die Headerdatei für diese Klasse hinzu.
Überschreiben
OnDataAvailable
Sie in dieser Klasse . Diese Funktion wird aufgerufen, wenn Daten zur Anzeige verfügbar sind. Wenn Daten verfügbar werden, können Sie sie beliebig behandeln, z. B. indem Sie sie schrittweise rendern.Der folgende Codeauszug ist ein einfaches Beispiel für das progressive Anzeigen von Daten in einem Bearbeitungssteuerelement. Beachten Sie die Verwendung der Kennzeichnung BSCF_FIRSTDATANOTIFICATION , um das Bearbeitungssteuerelement zu löschen.
void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag) { CListCtrl list_ctrl; CEdit *edit = list_ctrl.GetEditControl(); if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd) { edit->SetSel(0, -1); edit->Clear(); } if (dwSize > 0) { CString string; LPTSTR str = string.GetBuffer(dwSize); UINT nBytesRead = Read(str, dwSize); if (nBytesRead > 0) { string.ReleaseBuffer(nBytesRead); edit->SetSel(-1, -1); edit->ReplaceSel(string); } } }
Beachten Sie, dass Sie AFXCMN einschließen müssen. H, um die
CListCtrl
Klasse zu verwenden.Wenn sich der Gesamtzustand des Steuerelements ändert (z. B. vom Laden zum initialisierten oder interaktiven Benutzer), rufen Sie
COleControl::InternalSetReadyState
auf. Wenn Ihr Steuerelement nur über eine Datenpfadeigenschaft verfügt, können Sie Code zu BSCF_LASTDATANOTIFICATION hinzufügen, um den Container zu benachrichtigen, dass der Download abgeschlossen ist. Beispiel:if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
Überschreiben Sie
OnProgress
. InOnProgress
, Sie werden eine Zahl übergeben, die den maximalen Bereich und eine Zahl zeigt, wie weit der aktuelle Download ist. Sie können diese Zahlen verwenden, um den Status anzuzeigen, z. B. "Prozent abgeschlossen" für den Benutzer.
Die nächste Prozedur fügt dem Steuerelement eine Eigenschaft hinzu, um die gerade abgeleitete Klasse zu verwenden.
So fügen Sie eine Eigenschaft hinzu
Klicken Sie in der Klassenansicht mit der rechten Maustaste auf die Schnittstelle unter dem Bibliotheksknoten, und wählen Sie "Hinzufügen" und dann "Eigenschaft hinzufügen" aus. Dadurch wird der Assistent zum Hinzufügen von Eigenschaften gestartet.
Wählen Sie im Assistenten zum Hinzufügen von Eigenschaften das Optionsfeld "Methoden festlegen/abrufen " aus, geben Sie den Eigenschaftennamen ein, z. B. EditControlText, und wählen Sie BSTR als Eigenschaftentyp aus.
Klicken Sie auf Fertig stellen.
Deklarieren Sie eine Membervariable der
CDataPathProperty
abgeleiteten Klasse für Ihre ActiveX-Steuerelementklasse.CMyDataPathProperty EditControlText;
Implementieren Sie die
Get/Set
-Methoden. Geben Sie fürGet
die Zeichenfolge die Zeichenfolge zurück. LadenSet
Sie für , laden Sie die Eigenschaft und den AufrufSetModifiedFlag
.BSTR CMFCActiveXControlCtrl::GetEditControlText(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; strResult = EditControlText.GetPath(); return strResult.AllocSysString(); } void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); Load(newVal, EditControlText); SetModifiedFlag(); }
Fügen Sie in DoPropExchange die folgende Zeile hinzu:
PX_DataPath(pPX, _T("DataPath"), EditControlText);
Setzen Sie ResetData außer Kraft, um die Eigenschaft zu benachrichtigen, ihr Steuerelement zurückzusetzen, indem Sie diese Zeile hinzufügen:
EditControlText.ResetData();
Entscheiden, ob von CDataPathProperty oder CCachedDataPathProperty abgeleitet werden soll
Das vorherige Beispiel beschreibt die Schritte zum Ableiten der Eigenschaft Ihres Steuerelements von CDataPathProperty
. Dies ist eine gute Wahl, wenn Sie Echtzeitdaten herunterladen, die sich häufig ändern und für die Sie nicht alle Daten beibehalten müssen, sondern nur den aktuellen Wert. Ein Beispiel ist ein Aktienticker-Steuerelement.
Sie können auch von CCachedDataPathProperty
. In diesem Fall werden die heruntergeladenen Daten in einer Speicherdatei zwischengespeichert. Dies ist eine gute Wahl, wenn Sie alle heruntergeladenen Daten beibehalten müssen, z. B. ein Steuerelement, das eine Bitmap schrittweise rendert. In diesem Fall verfügt die Klasse über eine Membervariable, die Ihre Daten enthält:
CMemFile m_Cache;
In Ihrer ActiveX-Steuerelementklasse können Sie diese zugeordnete Speicherdatei OnDraw
verwenden, um die Daten anzuzeigen. Überschreiben Sie in der vom ActiveX-Steuerelement CCachedDataPathProperty
abgeleiteten Klasse die Memberfunktion OnDataAvailable
, und ungültigieren Sie das Steuerelement, nachdem Sie die Basisklassenimplementierung aufgerufen haben.
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
asynchrones Herunterladen von Daten mithilfe von ActiveX-Steuerelementen
Das Herunterladen von Daten über ein Netzwerk sollte asynchron erfolgen. Der Vorteil ist, dass der Downloadprozess andere Prozesse auf dem Client nicht blockiert, wenn eine große Datenmenge übertragen wird oder die Verbindung langsam ist.
Asynchrone Moniker bieten eine Möglichkeit, Daten asynchron über ein Netzwerk herunterzuladen. Ein Lesevorgang für einen asynchronen Moniker wird sofort zurückgegeben, auch wenn der Vorgang nicht abgeschlossen wurde.
Wenn beispielsweise nur 10 Bytes verfügbar sind und "Read" asynchron für eine 1K-Datei aufgerufen wird, wird Read nicht blockiert, sondern mit den derzeit verfügbaren 10 Bytes zurückgegeben.
Sie implementieren asynchrone Moniker mithilfe der CAsyncMonikerFile
Klasse. ActiveX-Steuerelemente können jedoch die Klasse verwenden, von CAsyncMonikerFile
der CDataPathProperty
abgeleitet wird, um asynchrone Steuerelementeigenschaften zu implementieren.
Anzeigen eines Steuerelements auf einer Webseite
Hier ist ein Beispiel für ein Objekttag und Attribute zum Einfügen eines Steuerelements auf einer Webseite.
<OBJECT
CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
CODEBASE="/ie/download/activex/iechart.ocx"
ID=chart1
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0>
<PARAM NAME="BackColor" value="#ffffff"/>
<PARAM NAME="ForeColor" value="#0000ff"/>
<PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>
Aktualisieren eines vorhandenen OLE-Steuerelements zur Verwendung neuer ActiveX-Steuerelementfeatures
Wenn Ihr OLE-Steuerelement mit einer Version von Visual C++ vor 4.2 erstellt wurde, können Sie die Leistung verbessern und die Funktionalität verbessern. Eine ausführliche Erläuterung dieser Änderungen finden Sie unter ActiveX-Steuerelemente: Optimierung.
Wenn Sie asynchrone Eigenschaftenunterstützung zu einem vorhandenen Steuerelement hinzufügen, müssen Sie die ready state-Eigenschaft und das ReadyStateChange
Ereignis selbst hinzufügen. Fügen Sie im Konstruktor für Ihr Steuerelement Folgendes hinzu:
m_lReadyState = READYSTATE_LOADING;
Sie aktualisieren den bereiten Zustand, während Ihr Code heruntergeladen wird, indem Sie COleControl::InternalSetReadyState aufrufen. Ein Ort, an dem Sie aufrufen können, stammt aus der OnProgress
Außerkraftsetzung InternalSetReadyState
der CDataPathProperty
abgeleiteten Klasse.
Siehe auch
MFC-Internetprogrammierungsaufgaben
Grundlagen der MFC-Internetprogrammierung