MFC-ActiveX-Steuerelemente: Weiterführende Themen
Dieser Artikel enthält die erweiterten Themen, die für das Entwickeln von ActiveX-Steuerelementen verknüpft sind.Dazu gehören:
Verwenden von Datenbankklassen mit ActiveX-Steuerelementen
Eine parametrisierte Eigenschaft implementieren
Behandeln von Fehlern im ActiveX-Steuerelement
Besondere Schlüssel im Steuerelement behandeln
Dialogfeld-Kontrollen zugreifen, die zur Laufzeit nicht sichtbar sind
Verwenden von Datenbankklassen mit ActiveX-Steuerelementen
Da die ActiveX-Steuerelement-Klassen Teil der Klassenbibliothek basieren, können Sie die gleichen Schritte und Regeln zum Verwenden von Datenbankklassen in einer Standard-MFC-Anwendung für das Entwickeln von ActiveX-Steuerelementen verwenden, die die MFC-Datenbankklassen verwenden.
Für eine allgemeine Übersicht über die MFC-Datenbankklassen finden Sie unter MFC-Datenbankklassen (DAO und ODBC).Der Artikel stellt die MFC-ODBC-Klassen und die MFC-DAO-Klassen und verweist auf jedem Sie auf Weitere Details.
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. |
Eine parametrisierte Eigenschaft implementieren
Eine parametrisierte Eigenschaft (gelegentlich ein Zeichenfolgenarray Eigenschaft bezeichnet) ist eine Methode für das Verfügbarmachen einer homogenen Auflistung von Werten als einzelne Eigenschaft des Steuerelements.Beispielsweise können Sie eine parametrisierte Eigenschaft verwenden, um ein Array oder ein Wörterbuch als Eigenschaft verfügbar zu machen.In Visual Basic wird 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 er ein Paar Get/Set-Funktionen hinzufügt, die dem Steuerelement Benutzern ermöglichen, die Eigenschaft mit der oben genannten Notation oder der Standardwert weise zuzugreifen.
Ähnlich wie die Methoden und Eigenschaften verfügen über parametrisierte Eigenschaften auch eine Beschränkung auf die zulässige Anzahl von Parametern.Im Fall von parametrisierten Eigenschaften handelt es sich um die Beschränkung 15 Parameter (wenn ein Parameter zum Speichern reserviert ist, des Eigenschaftswerts).
Im folgenden Verfahren wird eine parametrisierte Eigenschaft hinzu, das als Array genannt, zweidimensionales Array von ganzen Zahlen zugegriffen werden kann.
So erstellen 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 Knoten Bibliothek des Steuerelements.
Klicken Sie mit der rechten Maustaste auf den Knoten Schnittstellen für das Steuerelement (der zweite Knoten des Knotens Bibliothek), um das Kontextmenü zu öffnen.
Klicken Sie im Kontextmenü auf Hinzufügen und klicken Sie dann auf Eigenschaft hinzufügen.
Im Eigenschaftenname Feld Typ Array.
Im Eigenschaftentyp Feld den Eintrag short.
Für Implementierung-Typ auf Get/Set-Methoden.
In den Feldern und Get-Funktion Set-Funktion Geben Sie einen eindeutigen Namen für das abrufen und festlegen oder Funktionen akzeptieren die Standardnamen.
Fügen Sie einen Parameter hinzu, short-Typ ( row genannt), mit der Parametername und Parametertyp -Steuerelemente.
Fügen Sie einen zweiten Parameter hinzu, der columnshort-Typ () aufgerufen wird.
Klicken Sie auf Fertig stellen.
Änderungen vom Assistenten zum Hinzufügen von Eigenschaften
Wenn Sie eine benutzerdefinierte Eigenschaft hinzugefügt werden, geht der Assistent zum Hinzufügen von Eigenschaften Änderungen vor. (Header am SteuerelementklassenH) und die Implementierung (.CPP).
Die folgenden Zeilen werden für die Steuerelementklasse hinzugefügt. H-Datei:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Dieses Beispiel deklariert zwei Funktionen aufgerufen GetArray und SetArray, die dem Benutzer ermöglichen, eine bestimmte Zeile und einer Spalte anfordern, wenn die Eigenschaft zugreifen.
Darüber hinaus fügt der Assistent zum Hinzufügen von Eigenschaften des Steuerelements dispatchzuordnung die folgenden Zeilen hinzu, in der Implementierung der Steuerelementklassen (.CPP):
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Schließlich werden die Implementierungen GetArray und SetArray-Funktionen zum Ende der CPP-Datei hinzugefügt.In den meisten Fällen ändern Sie die Get-Funktion wird der Wert der Eigenschaft zurückgegeben wird.Die festgelegte Funktion enthält normalerweise Code, der ausgeführt werden soll, die vor oder nach jeder Eigenschaft ändert.
Damit diese Eigenschaft ist hilfreich, können Sie eine Membervariable des zweidimensionalen Arrays in der Steuerelementklasse des Typs zu speichern, short-Werten für die parametrisierte Eigenschaft deklarieren.Sie könnten die Get-Funktion dann ändern, um den Wert zurückgeben, der an der richtigen Zeile und Spalte gespeichert wurde, aufgezeichnet von der Parameter angegeben, und ändern Sie die festgelegte Funktion, um den Wert zu aktualisieren, die von den Parametern für Zeilen und Spalten verwiesen wurde.
Behandeln von Fehlern im ActiveX-Steuerelement
Wenn Fehlerbedingungen im Steuerelement auftreten, müssen Sie möglicherweise der Fehler den Steuerelementcontainer melden.Es gibt zwei Methoden zum Melden von Fehlern, je nachdem, welche Situation, in der der Fehler aufgetreten ist.Wenn der Fehler in einer Eigenschaft auftritt, rufen Sie die Funktion ab oder legen Sie fest oder innerhalb der Implementierung einer OLE-Automatisierungs-Methode, sollte das Steuerelement COleControl::ThrowError aufrufen, die Signalisiert dem Steuerelement Benutzern, dass ein Fehler aufgetreten ist.Wenn der Fehler in einer späteren Zeitpunkt auftritt, sollte das Steuerelement COleControl::FireError aufrufen, die ein vordefiniertes Fehlerereignis aus.
Um den Fehlertyp anzugeben, der auftritt, muss das Steuerelement einen Fehlercode an ThrowError oder FireError übergeben.Ein Fehlercode ist ein OLE-Statuscode, der einen 32-Bit-Wert verfügt.Wenn möglich, wählen Sie einen Fehlercode aus dem Standardsatz von Code aus, die in der OLECTL.H-Headerdatei definiert sind.Die folgende Tabelle enthält eine Zusammenfassung dieser 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 0 |
CTL_E_OUTOFSTRINGSPACE |
Aus Zeichenfolgen heraus leer |
CTL_E_OUTOFSTACKSPACE |
Nicht genügend Stapelspeicher |
CTL_E_BADFILENAMEORNUMBER |
Ungültiger Dateiname oder die Anzahl |
CTL_E_FILENOTFOUND |
Datei nicht gefunden |
CTL_E_BADFILEMODE |
Der Dateimodus |
CTL_E_FILEALREADYOPEN |
Datei bereits geöffnet |
CTL_E_DEVICEIOERROR |
Geräten-E/A-Fehler |
CTL_E_FILEALREADYEXISTS |
Die Datei ist bereits vorhanden |
CTL_E_BADRECORDLENGTH |
Länge des Rufs schlechten |
CTL_E_DISKFULL |
Datenträger ist voll |
CTL_E_BADRECORDNUMBER |
Anzahl der Rufs schlechten |
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 |
Fehler beim Datei- und Pfad |
CTL_E_PATHNOTFOUND |
Pfad 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 Zeilenindex array Eigenschaft |
CTL_E_SETNOTSUPPORTEDATRUNTIME |
Wird zur Laufzeit nicht unterstützt |
CTL_E_SETNOTSUPPORTED |
Wird nicht unterstützt (schreibgeschützte Eigenschaft) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Anfordern eigenschaft-Array Zeilenindex |
CTL_E_SETNOTPERMITTED |
Wird nicht zulässig |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Rufen Sie nicht unterstütztes zur Laufzeit |
CTL_E_GETNOTSUPPORTED |
Rufen Sie nicht unterstütztes ab (lesegeschützte Eigenschaft) |
CTL_E_PROPERTYNOTFOUND |
Eigenschaft nicht gefunden |
CTL_E_INVALIDCLIPBOARDFORMAT |
Ungültiges Format der Zwischenablage |
CTL_E_INVALIDPICTURE |
Ungültiges Bild |
CTL_E_PRINTERERROR |
Fehler beim Drucker |
CTL_E_CANTSAVEFILETOTEMP |
Kann TEMP Datei zu speichern |
CTL_E_SEARCHTEXTNOTFOUND |
Suchen Sie nicht den gefundenen Text |
CTL_E_REPLACEMENTSTOOLONG |
Ersetzungen zu lang |
Sofern notwendig, verwenden Sie die CUSTOM_CTL_SCODE Makro, um einen benutzerdefinierten Fehlercode für eine Bedingung zu definieren, die nicht durch einen der standardmäßigen Codes abgedeckt wird.Der Parameter für das Makro sollte eine ganze Zahl zwischen 1000 und einschließlich 32767 liegen.Beispiele:
#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 denselben numerischen Werten, die das VBX-Steuerelement verwendet, um sicherzustellen, dass die Fehlercodes kompatibel sind.
Besondere Schlüssel im Steuerelement behandeln
In einigen Fällen können Sie bestimmte Tastenkombinationen auf eine besondere Weise behandeln. Fügen Sie z. B. eine neue Zeile eingefügt, wenn die EINGABETASTE einem mehrzeiligen Textfeld-Steuerelement oder eine Verschiebung zwischen einer Gruppe Bearbeitungssteuerelemente gedrückt wurde, als eine direktionale Schlüssel-ID gedrückt hat.
Wenn die Basisklasse des ActiveX-Steuerelements COleControl ist, können Sie CWnd::PreTranslateMessage überschreiben, um Meldungen zu behandeln, bevor der Container sie verarbeitet.Diese Technik wird immer TRUE verwendet wird, wenn die Meldung in der Überschreibung von PreTranslateMessage bearbeiten.
Im folgenden Codebeispiel wird eine mögliche Methode des Behandlung aller Nachrichten, die an den direktionalen Schlüssel verknüpft sind.
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 die Behandlung von tastatur Schnittstellen für ein ActiveX-Steuerelement ActiveX, finden Sie in der Dokumentation.
Dialogfeld-Kontrollen zugreifen, die zur Laufzeit nicht sichtbar sind
Im Dialogfeld können Sie Steuerelemente erstellen, die keine Benutzeroberfläche aufweisen und zur Laufzeit nicht sichtbar sind.Wenn Sie ein unsichtbares während der Laufzeit einem Dialogfeld ActiveX-Steuerelement hinzufügen und CWnd::GetDlgItem verwenden, um das Steuerelement zuzugreifen, funktioniert das Steuerelement nicht ordnungsgemäß.Stattdessen sollten Sie eine der folgenden Techniken verwenden, um ein Objekt abzurufen, das das Steuerelement darstellt:
Verwenden des Assistenten zum Hinzufügen von Membervariablen wählen Sie dann die Option Steuerelementvariable und der ID des Steuerelements ausMembervariablen Geben Sie einen Namen ein, und wählen Sie die Wrapperklasse des Steuerelements als Steuerelementtyp aus.
- oder -
Deklarieren Sie eine lokale Variable, und ordnen Sie unter " - Element als das Dialogfeld.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();