Freigeben über


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 Einträge der Ereigniskarte für angepasste 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 mit dem 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, 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 namens "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.

Änderungen am Ereignisassistenten für benutzerdefinierte Ereignisse hinzufügen

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

Die folgenden Zeilen werden der Header-Datei (.H) Ihrer Steuerelementklasse hinzugefügt.

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 namens FireClickIn, die COleControl::FireEvent mit dem ClickIn-Ereignis und den Parametern aufruft, die Sie mithilfe des Assistenten zum Hinzufügen von Ereignissen definiert haben.

Außerdem wird die folgende Zeile der Ereigniszuordnung für das Steuerelement hinzugefügt, die sich in der Implementierungsdatei (.CPP) Ihrer Steuerelementklasse befindet:

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 der .IDL-Datei Ihres Steuerelements hinzugefügt.

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

Diese Zeile weist dem ClickIn-Ereignis eine spezifische ID-Nummer zu, die sich von der Position des Ereignisses in der Ereignisliste des Assistenten zum Hinzufügen von Ereignissen ableitet. 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.

Aufruf 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ösen, wenn ein Benutzer innerhalb eines kreisförmigen oder elliptischen Bereichs klickt. Die folgende Prozedur fügt den WM_LBUTTONDOWN Handler hinzu.

So fügen Sie einen Event Handler mit dem Assistenten für das 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 hat bereits eine Handler-Funktion zugewiesen bekommen.

  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 Implementierungs-.CPP-Datei Ihres ActiveX-Steuerelements zu springen.

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-Funktion Handler, OnLButtonDown, in der Circ Beispiel Zusammenfassung.

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

   COleControl::OnLButtonDown(nFlags, point);
}

Hinweis

Wenn der Assistent zum Hinzufügen von Ereignissen Nachrichten Handler für Maustastenaktionen erstellt, wird automatisch ein Aufruf zum gleichen Nachrichten Handler der Basisklasse hinzugefügt. Entfernen Sie diesen Aufruf nicht. Wenn Ihr Steuerelement eine der vordefinierten Mausnachrichten verwendet, müssen die Nachrichten-Handler in der Basisklasse aufgerufen werden, um sicherzustellen, dass die Mauserfassung ordnungsgemäß durchgeführt 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 vordefinierte Ereignisse erstellen; jedoch können Sie nicht beide im selben 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 Klick-Ereignis jederzeit auslösen, indem Sie dessen Auslösefunktion aufrufen.

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

So fügen Sie ein angepasstes Ereignis hinzu, das einen Standard-Ereignisnamen 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-Steuerelemente
MFC ActiveX-Steuerelemente: Methoden
COleControl-Klasse