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

  1. Laden Sie das Steuerelementprojekt.

  2. Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.

  3. Klicken Sie mit der rechten Maustaste auf den Schnittstellenknoten des Steuerelements (den zweiten Knoten des Bibliotheksknotens), um das Kontextmenü zu öffnen.

  4. Klicken Sie im Kontextmenü auf Hinzufügen und dann auf Eigenschaft hinzufügen.

  5. Geben Sie im Feld "Eigenschaftsname " den Namen Arrayein.

  6. Wählen Sie im Feld "Eigenschaftstyp " die Option shortaus.

  7. Klicken Sie unter Implementierungstypauf Get/Set-Methoden.

  8. 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.

  9. Fügen Sie mithilfe der Steuerelemente "Parametername" und "Parametertyp" einen Parameter hinzu, der als "Zeile" (typ short) bezeichnet wird.

  10. Fügen Sie einen zweiten Parameter namens "Spalte " hinzu (typ short).

  11. 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 shortdeklarieren, 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 PreTranslateMessagebehandeln.

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();
    

Siehe auch

MFC ActiveX Controls (MFC-ActiveX-Steuerelemente)