MFC-ActiveX-Steuerelemente: Hinzufügen von benutzerdefinierten Ereignissen

Benutzerdefinierte Ereignisse unterscheiden sich von Aktienereignissen darin, dass sie nicht automatisch von der Klasse COleControlausgelöst werden. Ein benutzerdefiniertes Ereignis erkennt eine bestimmte Aktion, die vom Steuerelemententwickler bestimmt wird, als Ereignis. Die Ereigniszuordnungseinträge für benutzerdefinierte Ereignisse werden durch das makro EVENT_CUSTOM dargestellt. Im folgenden Abschnitt wird ein benutzerdefiniertes Ereignis für ein ActiveX-Steuerelementprojekt implementiert, das mit dem ActiveX-Steuerelement-Assistenten erstellt wurde.

Hinzufügen eines benutzerdefinierten Ereignisses mit dem Assistenten zum Hinzufügen von Ereignissen

Die folgende Prozedur fügt ein bestimmtes benutzerdefiniertes Ereignis, ClickIn, hinzu. Mit diesem Verfahren können Sie weitere benutzerdefinierte Ereignisse hinzufügen. Ersetzen Sie ihren benutzerdefinierten Ereignisnamen und dessen Parameter für den ClickIn-Ereignisnamen und -parameter.

So fügen Sie das benutzerdefinierte ClickIn-Ereignis mithilfe des Assistenten zum Hinzufügen von Ereignissen hinzu

  1. Laden Sie das Steuerelementprojekt.

  2. Klicken Sie in der Klassenansicht mit der rechten Maustaste auf Ihre ActiveX-Steuerelementklasse, um das Kontextmenü zu öffnen.

  3. Klicken Sie im Kontextmenü auf Hinzufügen und dann auf Ereignis hinzufügen.

    Dadurch wird der Assistent zum Hinzufügen von Ereignissen geöffnet.

  4. Wählen Sie im Feld "Ereignisname" zuerst ein vorhandenes Ereignis aus, und klicken Sie dann auf das Optionsfeld "Benutzerdefiniert", und geben Sie "ClickIn" ein.

  5. Geben Sie im Feld "Interner Name " den Namen der Auslösenfunktion des Ereignisses ein. Verwenden Sie in diesem Beispiel den Standardwert, der vom Assistenten zum Hinzufügen von Ereignissen (FireClickIn) bereitgestellt wird.

  6. Fügen Sie einen Parameter mit dem Namen "xCoord " (Typ OLE_XPOS_PIXELS) mithilfe der Steuerelemente "Parametername " und "Parametertyp " hinzu.

  7. Fügen Sie einen zweiten Parameter hinzu, der als yCoord (Typ OLE_YPOS_PIXELS) bezeichnet wird.

  8. Klicken Sie auf "Fertig stellen ", um das Ereignis zu erstellen.

Hinzufügen von Ereignis-Assistentenänderungen für benutzerdefinierte Ereignisse

Wenn Sie ein benutzerdefiniertes Ereignis hinzufügen, nimmt der Assistent zum Hinzufügen von Ereignissen Änderungen an der Steuerelementklasse vor. H. CPP und . IDL-Dateien. Die folgenden Codebeispiele sind spezifisch für das ClickIn-Ereignis.

Die folgenden Zeilen werden der Kopfzeile (. H) Datei Ihrer Steuerelementklasse:

void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
   FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}

Dieser Code deklariert eine Inlinefunktion, die COleControl::FireEvent mit dem ClickIn-Ereignis und parametern aufruft FireClickIn, die Sie mithilfe des Assistenten zum Hinzufügen von Ereignissen definiert haben.

Darüber hinaus wird die folgende Zeile der Ereigniszuordnung für das Steuerelement hinzugefügt, die sich in der Implementierung befindet (. CPP)-Datei Ihrer Steuerelementklasse:

EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)

Dieser Code ordnet das Ereignis ClickIn der Inlinefunktion FireClickInzu, wobei die Parameter übergeben werden, die Sie mithilfe des Assistenten zum Hinzufügen von Ereignissen definiert haben.

Schließlich wird die folgende Zeile dem Steuerelement hinzugefügt. IDL-Datei:

[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);

Diese Zeile weist dem ClickIn-Ereignis eine bestimmte ID-Nummer zu, die von der Position des Ereignisses in der Ereignisliste "Ereignis-Assistent hinzufügen" stammt. Mit dem Eintrag in der Ereignisliste kann ein Container das Ereignis antizipieren. Sie kann z. B. Handlercode bereitstellen, der beim Auslösen des Ereignisses ausgeführt werden soll.

Aufrufen von FireClickIn

Nachdem Sie nun das benutzerdefinierte ClickIn-Ereignis mithilfe des Assistenten zum Hinzufügen von Ereignissen hinzugefügt haben, müssen Sie entscheiden, wann dieses Ereignis ausgelöst werden soll. Dazu rufen Sie auf FireClickIn , wenn die entsprechende Aktion auftritt. Für diese Diskussion verwendet das Steuerelement die InCircle Funktion innerhalb eines WM_LBUTTONDOWN Nachrichtenhandlers, um das ClickIn-Ereignis auszulöschen, wenn ein Benutzer innerhalb eines kreisförmigen oder auslassungsförmigen Bereichs klickt. Die folgende Prozedur fügt den WM_LBUTTONDOWN Handler hinzu.

So fügen Sie einen Nachrichtenhandler mit dem Assistenten zum Hinzufügen von Ereignissen hinzu

  1. Laden Sie das Steuerelementprojekt.

  2. Wählen Sie in der Klassenansicht Ihre ActiveX-Steuerelementklasse aus.

  3. Im Eigenschaftenfenster wird eine Liste der Nachrichten angezeigt, die vom ActiveX-Steuerelement behandelt werden können. Jede fett dargestellte Nachricht weist bereits eine Handlerfunktion zu.

  4. Wählen Sie die Nachricht aus, die Sie behandeln möchten. Wählen Sie in diesem Beispiel die Option WM_LBUTTONDOWNaus.

  5. Wählen Sie <im Dropdown-Listenfeld auf der rechten Seite "OnLButtonDown hinzufügen>" aus.

  6. Doppelklicken Sie in der Klassenansicht auf die neue Handlerfunktion, um zum Nachrichtenhandlercode in der Implementierung zu springen (. CPP)-Datei Ihres ActiveX-Steuerelements.

Im folgenden Codebeispiel wird die InCircle Funktion jedes Mal aufgerufen, wenn die linke Maustaste innerhalb des Steuerelementfensters geklickt wird. Dieses Beispiel finden Sie in der WM_LBUTTONDOWN Handlerfunktion, OnLButtonDownim Circ-Beispiel-Abstract .

void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   if (InCircle(point))
      FireClickIn(point.x, point.y);

   COleControl::OnLButtonDown(nFlags, point);
}

Hinweis

Wenn der Ereignis-Assistent zum Hinzufügen von Nachrichtenhandlern für Maustastenaktionen erstellt, wird automatisch ein Aufruf desselben Nachrichtenhandlers der Basisklasse hinzugefügt. Entfernen Sie diesen Aufruf nicht. Wenn Ihr Steuerelement eine der Stock-Mausnachrichten verwendet, müssen die Nachrichtenhandler in der Basisklasse aufgerufen werden, um sicherzustellen, dass die Mauserfassung ordnungsgemäß behandelt wird.

Im folgenden Beispiel wird das Ereignis nur ausgelöst, wenn der Klick innerhalb eines kreisförmigen oder elliptischen Bereichs innerhalb des Steuerelements erfolgt. Um dieses Verhalten zu erreichen, können Sie die Funktion in der InCircle Implementierung Ihres Steuerelements platzieren (. CPP)-Datei:

VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
   CRect rc;
   GetClientRect(rc);
   // Determine radii
   double a = (rc.right - rc.left) / 2;
   double b = (rc.bottom - rc.top) / 2;

   // Determine x, y
   double x = point.x - (rc.left + rc.right) / 2;
   double y = point.y - (rc.top + rc.bottom) / 2;

   // Apply ellipse formula
   return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}

Außerdem müssen Sie die folgende Deklaration der InCircle Funktion zum Header des Steuerelements hinzufügen (. H) Datei:

VARIANT_BOOL InCircle(CPoint& point);

Benutzerdefinierte Ereignisse mit Aktiennamen

Sie können benutzerdefinierte Ereignisse mit demselben Namen wie Aktienereignisse erstellen, sie können jedoch nicht beide in demselben Steuerelement implementieren. Sie können beispielsweise ein benutzerdefiniertes Ereignis namens Click erstellen, das nicht ausgelöst wird, wenn das Stockereignis Click normalerweise ausgelöst würde. Anschließend können Sie das Click-Ereignis jederzeit auslösen, indem Sie dessen Schießfunktion aufrufen.

Die folgende Prozedur fügt ein benutzerdefiniertes Click-Ereignis hinzu.

So fügen Sie ein benutzerdefiniertes Ereignis hinzu, das einen Aktienereignisnamen verwendet

  1. Laden Sie das Steuerelementprojekt.

  2. Klicken Sie in der Klassenansicht mit der rechten Maustaste auf Ihre ActiveX-Steuerelementklasse, um das Kontextmenü zu öffnen.

  3. Klicken Sie im Kontextmenü auf Hinzufügen und dann auf Ereignis hinzufügen.

    Dadurch wird der Assistent zum Hinzufügen von Ereignissen geöffnet.

  4. Wählen Sie in der Dropdownliste "Ereignisname " einen Aktienereignisnamen aus. Wählen Sie in diesem Beispiel "Klicken" aus.

  5. Wählen Sie für den Ereignistyp " Benutzerdefiniert" aus.

  6. Klicken Sie auf "Fertig stellen ", um das Ereignis zu erstellen.

  7. Rufen Sie FireClick an entsprechenden Stellen in Ihrem Code auf.

Siehe auch

MFC ActiveX Controls (MFC-ActiveX-Steuerelemente)
MFC-ActiveX-Steuerelemente: Methoden
COleControl-Klasse