MFC-ActiveX-Steuerelemente: Weiterführende Themen
Dieser Artikel enthält die erweiterten Themen, die zur Entwicklung von ActiveX-Steuerelementen verknüpft werden. Dazu gehören:
Verwenden von Datenbankklassen in ActiveX-Steuerelemente
Implementieren einer parametrisierten Eigenschaft
Fehlerbehandlung im ActiveX-Steuerelement
Behandeln von Special-Tasten im Steuerelement
Klicken Sie Dialogfeld-Kontrollen zugreifen, die zur Laufzeit nicht sichtbar sind
Verwenden von Datenbankklassen in ActiveX-Steuerelemente
Da die ActiveX-Steuerelement-Klassen Teil der Klassenbibliothek sind, können Sie die gleichen Verfahren und Regeln für die Verwendung der Datenbankklassen in einer Standard-MFC-Anwendung auf die Entwicklung der ActiveX-Steuerelemente verwenden, die die MFC-Datenbankklassen verwenden.
Eine allgemeine Übersicht der MFC-Datenbankklassen, finden Sie unter MFC-Datenbankklassen (DAO und ODBC). Der Artikel stellt die MFC-ODBC- und MFC-DAO-Klassen vor und verweist Sie auf Details zu jedem.
Hinweis
Ab Visual C++ .NET wird DAO von der Visual C++-Umgebung und den Assistenten nicht mehr unterstützt. (Die DAO-Klassen sind allerdings weiterhin enthalten und können verwendet werden.)Microsoft empfiehlt, dass Sie OLE DB-Vorlagen oder ODBC und MFC für neue Projekte verwenden.DAO sollte lediglich zur Verwaltung bereits bestehender Anwendungen eingesetzt werden.
Implementieren einer parametrisierten Eigenschaft
Eine parametrisierte Eigenschaft (gelegentlich aufgerufen ein Eigenschaftenarray) ist eine Methode für das Verfügbarmachen einer homogenen Auflistung Werte als einzelne Eigenschaft des Steuerelements. Beispielsweise können Sie eine parametrisierte Eigenschaft verwenden, um ein Array oder ein Wörterbuch als Eigenschaft verfügbar 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 hinzufügen, die dem Steuerelementbenutzer ermöglichen, auf die Eigenschaft mithilfe der oben erwähnten Notation oder in der Standardweise zuzugreifen.
Ähnlich den Methoden und Eigenschaften, über parametrisierte Eigenschaften auch eine Begrenzung für die Anzahl der zulässigen Parameter. Im Fall von parametrisierten Eigenschaften ist die Grenze 15 Parameter (wenn ein Parameter zum Speichern des Eigenschaftswerts, reserviert ist).
Im folgenden Verfahren wird eine parametrisierte Eigenschaft hinzu, aufgerufen Array, auf das als zweidimensionales Array von Ganzzahlen zugegriffen werden kann.
So fügen Sie eine parametrisierte Eigenschaft mithilfe des Assistenten zum Hinzufügen von Eigenschaften hinzufügen
Laden Sie das Projekt des Steuerelements.
Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.
Klicken Sie auf den Schnittstellenknoten für das Steuerelement (der zweite Knoten des Bibliotheksknotens) mit der rechten Maustaste um das Kontextmenü zu öffnen.
Klicken Sie im Kontextmenü auf Hinzufügen und dann auf Eigenschaft hinzufügen.
Im Feld Eigenschaftenname geben Sie Array ein.
Im Feld Eigenschaftentyp die Option short aus.
Für Implementierung-Typ auf Get/Set-Methoden.
In den Feldern Get-Funktion und Set-Funktion geben Sie eindeutigen Namen für das abrufen und festlegen Funktionen oder übernehmen die Standardnamen ein.
Fügen Sie einen Parameter hinzu, die row-Typ ( short), mit Parametername und Parametertyp -Steuerelemente.
Fügen Sie einen zweiten Parameter hinzu, der column-Typ ( short) aufgerufen wird.
Klicken Sie auf Fertig stellen.
Änderungen vom Assistenten zum Hinzufügen von Eigenschaften
Wenn Sie eine benutzerdefinierte Eigenschaft hinzugefügt, wird der Assistent zum Hinzufügen von Eigenschaften Änderungen an der Steuerelementklassenkopfzeile vor (.H) und Dateien die Implementierungsdatei (.CPP).
Die folgenden Zeilen werden der Steuerelementklasse hinzugefügt. Außerdem:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Dieser Code deklariert zwei Funktionen aufgerufen GetArray und SetArray, die dem Benutzer ermöglichen, eine bestimmte Zeile und eine Spalte zu anfordern, wenn sie auf die Eigenschaft zugreifen.
Darüber hinaus fügt der Assistent zum Hinzufügen von Eigenschaften die folgenden Zeilen der Steuerdispatchzuordnung hinzu, in der Steuerelementklasse (.CPP):
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Schließlich werden Implementierungen die GetArray und SetArray Features zum Ende der CPP-Datei hinzugefügt. In den meisten Fällen ändern Sie die Abrufensfunktion, um den Wert der Eigenschaft zurückgegeben. Die festgelegte Funktion enthält normalerweise Code, der ausgeführt werden soll, einen, vor oder nach der Eigenschaft ändert.
Damit diese Eigenschaft ist hilfreich, können Sie eine Membervariable des zweidimensionalen Arrays in der Steuerelementklasse, des Typs short, den mittels für die parametrisierte Eigenschaft deklarieren. Sie können die Abrufensfunktion dann ändern, um den Wert zurückzugeben, der an der richtigen Zeile und in der Spalte gespeichert wurde, wie durch die Parameter angegeben und die festgelegte Funktion, um den Wert zu aktualisieren, der durch die Zeilen- und Spaltenparameter verwiesen wurde.
Fehlerbehandlung im ActiveX-Steuerelement
Wenn Fehlerzustände im Steuerelement auftreten, müssen Sie möglicherweise den Fehler den Steuerelementcontainer melden. Es gibt zwei Methoden für das Melden von Fehlern, abhängig von der Situation, in der der Fehler auftritt. Wenn der Fehler in einer Eigenschaft auftritt, get oder set Funktion fest, oder in der Implementierung einer OLE-Automatisierungs-Methode, sollte das Steuerelement die COleControl::ThrowError aufrufen, das z Steuerelementbenutzer signalisiert, dass ein Fehler aufgetreten ist. Wenn der Fehler zu jeder anderen Zeitpunkt auftritt, sollte das Steuerelement die COleControl::FireError aufrufen, ein vordefiniertes Fehlerereignis auslöst.
Um der Fehlertyp anzugeben die aufgetreten ist, muss das Steuerelement einen Fehlercode an ThrowError oder FireError übergeben. Ein Fehlercode ist ein OLE-Statuscode, der einen 32-Bit-Wert hat. Wenn möglich, wählen Sie einen Fehlercode aus Standardsatz mit Codes aus, die in der OLECTL.H-Headerdatei definiert werden. In der folgenden Tabelle werden diese Code zusammen.
ActiveX-Steuerelement-Fehlercodes
Fehler |
Beschreibung |
---|---|
CTL_E_ILLEGALFUNCTIONCALL |
Ungültiger Funktionsaufruf |
CTL_E_OVERFLOW |
Overflow |
CTL_E_OUTOFMEMORY |
Nicht genügend Arbeitsspeicher |
CTL_E_DIVISIONBYZERO |
Division durch Null |
CTL_E_OUTOFSTRINGSPACE |
Aus Zeichenfolgenleerzeichen Auschecken |
CTL_E_OUTOFSTACKSPACE |
Aus Stapelspeicher Auschecken |
CTL_E_BADFILENAMEORNUMBER |
Ungültiger Dateiname oder Zahl |
CTL_E_FILENOTFOUND |
Die Datei wurde nicht gefunden. |
CTL_E_BADFILEMODE |
Ungültiger Modus Alle Dateien |
CTL_E_FILEALREADYOPEN |
Datei bereits geöffnet |
CTL_E_DEVICEIOERROR |
Geräten-E/A-Fehler |
CTL_E_FILEALREADYEXISTS |
Datei ist bereits vorhanden |
CTL_E_BADRECORDLENGTH |
Länge des schlechten Aufruf |
CTL_E_DISKFULL |
Datenträger ist voll |
CTL_E_BADRECORDNUMBER |
Nummer des schlechten Aufruf |
CTL_E_BADFILENAME |
Ungültiger Dateiname |
CTL_E_TOOMANYFILES |
Zu viele Dateien |
CTL_E_DEVICEUNAVAILABLE |
Gerät nicht verfügbar |
CTL_E_PERMISSIONDENIED |
Berechtigung verweigert |
CTL_E_DISKNOTREADY |
Datenträger nicht bereit |
CTL_E_PATHFILEACCESSERROR |
Pfad/Dateizugriffsfehler |
CTL_E_PATHNOTFOUND |
Pfad nicht gefunden |
CTL_E_INVALIDPATTERNSTRING |
Ungültige Musterzeichenfolge |
CTL_E_INVALIDUSEOFNULL |
Ungültiger Verwendung von NULL |
CTL_E_INVALIDFILEFORMAT |
Ungültiges Dateiformat |
CTL_E_INVALIDPROPERTYVALUE |
Ungültiger Eigenschaftswert |
CTL_E_INVALIDPROPERTYARRAYINDEX |
Ungültiger Eigenschaftenarrayindex |
CTL_E_SETNOTSUPPORTEDATRUNTIME |
Satz nicht zur Laufzeit unterstützt |
CTL_E_SETNOTSUPPORTED |
Satz nicht unterstützt (schreibgeschützte Eigenschaft) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Anforderungseigenschaften-Arrayindex |
CTL_E_SETNOTPERMITTED |
Satz nicht zulässig |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Rufen Sie nicht unterstütztes zur Laufzeit ab |
CTL_E_GETNOTSUPPORTED |
Rufen Sie nicht unterstütztes ab (lesegeschützte Eigenschaft) |
CTL_E_PROPERTYNOTFOUND |
Eigenschaft nicht gefunden |
CTL_E_INVALIDCLIPBOARDFORMAT |
Ungültiges Zwischenablageformat |
CTL_E_INVALIDPICTURE |
Ungültiges Bild |
CTL_E_PRINTERERROR |
Druckerfehler |
CTL_E_CANTSAVEFILETOTEMP |
Kann Datei zu speichern TEMP |
CTL_E_SEARCHTEXTNOTFOUND |
Suchen Sie den gesuchten Text |
CTL_E_REPLACEMENTSTOOLONG |
jeweiligen Ersatz zu lang |
Falls nötig verwenden Sie das Makro CUSTOM_CTL_SCODE, um einen benutzerdefinierten Fehlercode für eine Bedingung zu definieren, die nicht durch einen der Standardcodes abgedeckt wird. Der Parameter für dieses Makros sollte eine ganze Zahl zwischen 1000 und 32767 sein, liegen. Beispiel:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Wenn Sie ein ActiveX-Steuerelement erstellen, um ein vorhandenes VBX-Steuerelement zu ersetzen, definieren Sie die ActiveX-Steuerelement-Fehlercodes mit den gleichen numerischen Werte, die das VBX-Steuerelement verwendet, um sicherzustellen, dass die Fehlercodes kompatibel sind.
Behandeln von Special-Tasten im Steuerelement
In einigen Fällen möchten Sie möglicherweise bestimmte Tastenkombinationen auf eine besondere Weise behandeln; beispielsweise fügen Sie eine neue Zeile ein, wenn der EINGABETASTE einem mehrzeiligen Textfeld-Steuerelement oder eine Verschiebung zwischen einer Gruppe Bearbeitungssteuerelementen gedrückt wird, als eine gerichtetes Schlüssel-ID geklickt hat.
Wenn die Basisklasse des ActiveX-Steuerelements COleControl handelt, kann CWnd::PreTranslateMessage überschreiben, um Meldungen verarbeiten, bevor der Container sie verarbeitet. Bei diesem Verfahren wird immer TRUE zurückgegeben, wenn Sie die Meldung in der Überschreibung der PreTranslateMessage bearbeiten.
Das folgende Codebeispiel zeigt eine beliebige Weise der Behandlung aller Nachrichten, die den direktionalen Schlüssel verknüpft werden.
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 über Behandlungstastaturschnittstellen für ein ActiveX-Steuerelement, finden Sie die ActiveX-SDK-Dokumentation.
Klicken Sie Dialogfeld-Kontrollen zugreifen, die zur Laufzeit nicht sichtbar sind
Sie können Dialogfeldkontrollen erstellen, die keine Benutzeroberfläche aufweisen und zur Laufzeit nicht sichtbar sind. Wenn Sie eine während der Laufzeit unsichtbar ActiveX-Steuerelement einem Dialogfeld hinzufügen und CWnd::GetDlgItem verwenden, um auf das Steuerelement zugreifen, funktioniert das Steuerelement nicht richtig. Stattdessen sollten Sie eine der folgenden Techniken verwenden, um ein Objekt abzurufen, das das Steuerelement darstellt:
Mit dem Assistenten zum Hinzufügen von Membervariablen Option Steuerelementvariable und die ID des Steuerelements aus Geben Sie einen Membervariablennamen ein und wählen Sie die Wrapperklasse des Steuerelements als Steuerelementtyp.
- oder -
Deklarieren Sie eine lokale und ordnen Sie als das Dialogfeldelement unter. Fügen Sie Code ein, der dem folgenden ähnelt (CMyCtrl ist die Wrapperklasse, IDC_MYCTRL1 ist die ID des Steuerelements):
CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();