MFC-ActiveX-Steuerelemente: Weiterführende Themen
Dieser Artikel befasst sich mit erweiterten Themen im Zusammenhang mit der Entwicklung von ActiveX-Steuerelementen. Dazu gehören:
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.
Verwenden von Datenbankklassen in ActiveX-Steuerelementen
Da die ActiveX-Steuerelementklassen Teil der Klassenbibliothek sind, können Sie dieselben Prozeduren und Regeln für die Verwendung von Datenbankklassen in einer MFC-Standardanwendung anwenden, um ActiveX-Steuerelemente zu entwickeln, die die MFC-Datenbankklassen verwenden.
Eine allgemeine Übersicht über die MFC-Datenbankklassen finden Sie unter MFC-Datenbankklassen (DAO und ODBC). Der Artikel führt sowohl die MFC ODBC-Klassen als auch die MFC DAO-Klassen ein und leitet Sie zu weiteren Details zu beiden.
Hinweis
DAO wird bis Office 2013 unterstützt. DAO 3.6 ist die letzte Version und gilt als veraltet. Die Visual C++-Umgebung und -Assistenten unterstützen DAO nicht (obwohl die DAO-Klassen enthalten sind und Sie sie weiterhin verwenden können). Microsoft empfiehlt, OLE DB-Vorlagen oder ODBC- und MFC für neue Projekte zu verwenden. Sie sollten DAO nur in Standard vorhandenen Anwendungen verwenden.
Implementieren einer parametrisierten Eigenschaft
Eine parametrisierte Eigenschaft (manchmal auch als Eigenschaftsarray bezeichnet) ist eine Methode zum Verfügbarmachen einer homogenen Auflistung von Werten als einzelne Eigenschaft des Steuerelements. Sie können beispielsweise eine parametrisierte Eigenschaft verwenden, um ein Array oder ein Wörterbuch als Eigenschaft verfügbar zu machen. In Visual Basic wird auf eine solche Eigenschaft mithilfe der Arraynotation zugegriffen:
x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array
Verwenden Sie den Assistenten zum Hinzufügen von Eigenschaften, um eine parametrisierte Eigenschaft zu implementieren. Der Assistent zum Hinzufügen von Eigenschaften implementiert die Eigenschaft, indem ein Paar Get/Set-Funktionen hinzugefügt werden, mit denen der Steuerelementbenutzer mithilfe der obigen Schreibweise oder standardmäßig auf die Eigenschaft zugreifen kann.
Ähnlich wie Methoden und Eigenschaften weisen parametrisierte Eigenschaften auch eine Beschränkung auf die Zulässige Anzahl von Parametern auf. Bei parametrisierten Eigenschaften beträgt der Grenzwert 15 Parameter (mit einem Parameter, der zum Speichern des Eigenschaftswerts reserviert ist).
Die folgende Prozedur fügt eine parametrisierte Eigenschaft namens Array hinzu, auf die als zweidimensionales Array von ganzzahligen Zahlen zugegriffen werden kann.
So fügen Sie eine parametrisierte Eigenschaft mithilfe des Assistenten zum Hinzufügen von Eigenschaften hinzu
Laden Sie das Steuerelementprojekt.
Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.
Klicken Sie mit der rechten Maustaste auf den Schnittstellenknoten des Steuerelements (den zweiten Knoten des Bibliotheksknotens), um das Kontextmenü zu öffnen.
Klicken Sie im Kontextmenü auf Hinzufügen und dann auf Eigenschaft hinzufügen.
Geben Sie im Feld "Eigenschaftsname " den Namen
Array
ein.Wählen Sie im Feld "Eigenschaftstyp " die Option
short
aus.Klicken Sie unter Implementierungstypauf Get/Set-Methoden.
Geben Sie in den Feldern "Funktion abrufen" und "Funktion festlegen" eindeutige Namen für Die Get- und Set-Funktionen ein, oder akzeptieren Sie die Standardnamen.
Fügen Sie mithilfe der Steuerelemente "Parametername" und "Parametertyp" einen Parameter hinzu, der als "Zeile" (typ short) bezeichnet wird.
Fügen Sie einen zweiten Parameter namens "Spalte " hinzu (typ short).
Klicken Sie auf Fertig stellen.
Änderungen, die vom Assistenten zum Hinzufügen von Eigenschaften vorgenommen wurden
Wenn Sie eine benutzerdefinierte Eigenschaft hinzufügen, nimmt der Assistent zum Hinzufügen von Eigenschaften Änderungen am Steuerelementklassenheader vor (. H) und die Implementierung (. CPP)-Dateien.
Die folgenden Zeilen werden der Steuerelementklasse hinzugefügt. H-Datei:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Dieser Code deklariert zwei aufgerufene Funktionen GetArray
und SetArray
ermöglicht es dem Benutzer, beim Zugriff auf die Eigenschaft eine bestimmte Zeile und Spalte anzufordern.
Darüber hinaus fügt der Assistent zum Hinzufügen von Eigenschaften die folgenden Zeilen zur Steuerelement-Verteilerzuordnung hinzu, die sich in der Implementierung der Steuerelementklasse befindet (. CPP)-Datei:
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Schließlich werden die Implementierungen der GetArray
Und SetArray
Funktionen am Ende der . CPP-Datei. In den meisten Fällen ändern Sie die Get-Funktion, um den Wert der Eigenschaft zurückzugeben. Die Set-Funktion enthält in der Regel Code, der entweder vor oder nach der Änderung der Eigenschaft ausgeführt werden soll.
Damit diese Eigenschaft nützlich ist, können Sie eine zweidimensionale Arraymemmemmvariable in der Steuerelementklasse des Typs short
deklarieren, um Werte für die parametrisierte Eigenschaft zu speichern. Anschließend können Sie die Get-Funktion ändern, um den Wert zurückzugeben, der in der richtigen Zeile und Spalte gespeichert ist, wie durch die Parameter angegeben, und die Set-Funktion ändern, um den Wert zu aktualisieren, auf den die Zeilen- und Spaltenparameter verweisen.
Behandeln von Fehlern in Ihrem ActiveX-Steuerelement
Wenn Fehlerbedingungen im Steuerelement auftreten, müssen Sie möglicherweise den Fehler an den Steuerelementcontainer melden. Es gibt zwei Methoden zum Melden von Fehlern, abhängig von der Situation, in der der Fehler auftritt. Wenn der Fehler innerhalb der Get- oder Set-Funktion einer Eigenschaft oder innerhalb der Implementierung einer OLE-Automatisierungsmethode auftritt, sollte das Steuerelement COleControl::ThrowError aufrufen, das dem Steuerelementbenutzer signalisiert, dass ein Fehler aufgetreten ist. Wenn der Fehler zu einem anderen Zeitpunkt auftritt, sollte das Steuerelement COleControl::FireError aufrufen, wodurch ein Stock Error-Ereignis ausgelöst wird.
Um die Art des aufgetretenen Fehlers anzugeben, muss das Steuerelement einen Fehlercode ThrowError
an oder FireError
übergeben. Ein Fehlercode ist ein OLE-Statuscode, der einen 32-Bit-Wert aufweist. Wählen Sie nach Möglichkeit einen Fehlercode aus dem Standardsatz von Codes aus, die in der OLECTL definiert sind. H-Headerdatei. In der folgenden Tabelle sind diese Codes zusammengefasst.
ActiveX-Steuerelementfehlercodes
Error | Beschreibung |
---|---|
CTL_E_ILLEGALFUNCTIONCALL | Unzulässiger Funktionsaufruf |
CTL_E_OVERFLOW | Überlauf |
CTL_E_OUTOFMEMORY | Nicht genügend Arbeitsspeicher |
CTL_E_DIVISIONBYZERO | Division durch Null |
CTL_E_OUTOFSTRINGSPACE | Nicht genügend Zeichenfolgenspeicher |
CTL_E_OUTOFSTACKSPACE | Nicht genügend Stapelspeicher |
CTL_E_BADFILENAMEORNUMBER | Der Dateiname oder die Zahl ist ungültig. |
CTL_E_FILENOTFOUND | File not found |
CTL_E_BADFILEMODE | Fehlerhafter Dateimodus. |
CTL_E_FILEALREADYOPEN | Die Datei ist bereits geöffnet. |
CTL_E_DEVICEIOERROR | Geräte-E/A-Fehler |
CTL_E_FILEALREADYEXISTS | Datei bereits vorhanden |
CTL_E_BADRECORDLENGTH | Ungültige Datensatzlänge. |
CTL_E_DISKFULL | Datenträger voll |
CTL_E_BADRECORDNUMBER | Ungültige Datensatznummer |
CTL_E_BADFILENAME | Ungültiger Dateiname |
CTL_E_TOOMANYFILES | Zu viele Dateien |
CTL_E_DEVICEUNAVAILABLE | Das Gerät ist nicht verfügbar |
CTL_E_PERMISSIONDENIED | Berechtigung verweigert |
CTL_E_DISKNOTREADY | Das Laufwerk ist nicht bereit |
CTL_E_PATHFILEACCESSERROR | Pfad-/Dateizugriffsfehler |
CTL_E_PATHNOTFOUND | Der Pfad wurde nicht gefunden |
CTL_E_INVALIDPATTERNSTRING | Ungültige Musterzeichenfolge |
CTL_E_INVALIDUSEOFNULL | Ungültige Verwendung von NULL |
CTL_E_INVALIDFILEFORMAT | Ungültiges Dateiformat |
CTL_E_INVALIDPROPERTYVALUE | Ungültiger Eigenschaftswert |
CTL_E_INVALIDPROPERTYARRAYINDEX | Ungültiger Eigenschaftenarrayindex |
CTL_E_SETNOTSUPPORTEDATRUNTIME | "Set" wird zur Laufzeit nicht unterstützt |
CTL_E_SETNOTSUPPORTED | "Set" wird nicht unterstützt (schreibgeschützte Eigenschaft) |
CTL_E_NEEDPROPERTYARRAYINDEX | Ein Eigenschaftenarrayindex wird benötigt |
CTL_E_SETNOTPERMITTED | "Set" ist unzulässig. |
CTL_E_GETNOTSUPPORTEDATRUNTIME | 'Get' wird zur Laufzeit nicht unterstützt |
CTL_E_GETNOTSUPPORTED | 'Get' wird nicht unterstützt (lesegeschützte Eigenschaft) |
CTL_E_PROPERTYNOTFOUND | Die Eigenschaft wurde nicht gefunden |
CTL_E_INVALIDCLIPBOARDFORMAT | Ungültiges Format der Zwischenablage |
CTL_E_INVALIDPICTURE | Ungültiges Bild |
CTL_E_PRINTERERROR | Druckerfehler |
CTL_E_CANTSAVEFILETOTEMP | Datei kann nicht in TEMP gespeichert werden |
CTL_E_SEARCHTEXTNOTFOUND | Suchtext wurde nicht gefunden |
CTL_E_REPLACEMENTSTOOLONG | Die Ersetzungen sind zu lang |
Verwenden Sie bei Bedarf das makro CUSTOM_CTL_SCODE, um einen benutzerdefinierten Fehlercode für eine Bedingung zu definieren, die nicht von einem der Standardcodes abgedeckt wird. Der Parameter für dieses Makro sollte eine ganze Zahl zwischen 1000 und 32767 (einschließlich) sein. Beispiel:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Wenn Sie ein ActiveX-Steuerelement erstellen, um ein vorhandenes VBX-Steuerelement zu ersetzen, definieren Sie Ihre ActiveX-Steuerelementfehlercodes mit denselben numerischen Werten, die das VBX-Steuerelement verwendet, um sicherzustellen, dass die Fehlercodes kompatibel sind.
Behandeln von Sondertasten im Steuerelement
In einigen Fällen sollten Sie bestimmte Tastenkombinationen auf besondere Weise behandeln. Fügen Sie z. B. eine neue Zeile ein, wenn die EINGABETASTE in einem mehrzeiligen Textfeld-Steuerelement gedrückt wird, oder wechseln Sie zwischen einer Gruppe von Bearbeitungssteuerelementen, wenn eine Richtungstasten-ID gedrückt wird.
Wenn die Basisklasse Ihres ActiveX-Steuerelements lautetCOleControl
, können Sie CWnd::P reTranslateMessage überschreiben, um Nachrichten zu verarbeiten, bevor der Container sie verarbeitet. Wenn Sie diese Technik verwenden, geben Sie immer TRUE zurück, wenn Sie die Nachricht in Ihrer Außerkraftsetzung PreTranslateMessage
behandeln.
Im folgenden Codebeispiel wird eine mögliche Methode zum Behandeln von Nachrichten im Zusammenhang mit den Richtungsschlüsseln veranschaulicht.
BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
BOOL bHandleNow = FALSE;
switch (pMsg->message)
{
case WM_KEYDOWN:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
{
OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
}
break;
}
return bHandleNow;
}
Weitere Informationen zum Behandeln von Tastaturschnittstellen für ein ActiveX-Steuerelement finden Sie in der ActiveX SDK-Dokumentation.
Zugreifen auf Dialogfeldsteuerelemente, die zur Laufzeit unsichtbar sind
Sie können Dialogfeldsteuerelemente erstellen, die keine Benutzeroberfläche aufweisen und zur Laufzeit unsichtbar sind. Wenn Sie einem Dialogfeld ein unsichtbares ActiveX-Steuerelement zur Laufzeit hinzufügen und CWnd::GetDlgItem verwenden, um auf das Steuerelement zuzugreifen, funktioniert das Steuerelement nicht ordnungsgemäß. Stattdessen sollten Sie eine der folgenden Techniken verwenden, um ein Objekt abzurufen, das das Steuerelement darstellt:
Wählen Sie mithilfe des Assistenten zum Hinzufügen von Membervariablen die Steuerelementvariable und dann die ID des Steuerelements aus. Geben Sie einen Membervariablennamen ein, und wählen Sie die Wrapperklasse des Steuerelements als Steuerelementtyp aus.
Oder
Deklarieren Sie eine lokale Variable und Unterklasse als Dialogfeldelement. Fügen Sie Code ein, der wie folgt aussieht (
CMyCtrl
ist die Wrapperklasse, IDC_MYCTRL1 die ID des Steuerelements ist):CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();