Udostępnij za pośrednictwem


Formanty MFC ActiveX: dodawanie zdarzeń niestandardowych

Zdarzenia niestandardowe różnią się od zdarzeń magazynowych, które nie są automatycznie wyzwalane przez klasę COleControl. Zdarzenie niestandardowe rozpoznaje określoną akcję określaną przez dewelopera kontrolek jako zdarzenie. Wpisy mapy zdarzeń dla zdarzeń niestandardowych są reprezentowane przez makro EVENT_CUSTOM. W poniższej sekcji zaimplementowano zdarzenie niestandardowe dla projektu kontrolki ActiveX, które zostało utworzone przy użyciu Kreatora kontrolek ActiveX.

Dodawanie zdarzenia niestandardowego za pomocą Kreatora dodawania zdarzeń

Poniższa procedura dodaje określone zdarzenie niestandardowe ClickIn. Ta procedura służy do dodawania innych zdarzeń niestandardowych. Zastąp niestandardową nazwę zdarzenia i jego parametry nazwą i parametrami zdarzenia ClickIn.

Aby dodać zdarzenie niestandardowe ClickIn przy użyciu Kreatora dodawania zdarzeń

  1. Załaduj projekt kontrolki.

  2. W widoku klasy kliknij prawym przyciskiem myszy klasę kontrolki ActiveX, aby otworzyć menu skrótów.

  3. W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj zdarzenie.

    Spowoduje to otwarcie Kreatora dodawania zdarzeń.

  4. W polu Nazwa zdarzenia najpierw wybierz dowolne istniejące zdarzenie, a następnie kliknij przycisk radiowy Niestandardowy , a następnie wpisz ClickIn.

  5. W polu Nazwa wewnętrzna wpisz nazwę funkcji wyzwalania zdarzenia. W tym przykładzie użyj wartości domyślnej podanej przez Kreatora dodawania zdarzeń (FireClickIn).

  6. Dodaj parametr o nazwie xCoord (typ OLE_XPOS_PIXELS), używając kontrolek Nazwa parametru i Typ parametru.

  7. Dodaj drugi parametr o nazwie yCoord (typ OLE_YPOS_PIXELS).

  8. Kliknij przycisk Zakończ , aby utworzyć zdarzenie.

Dodawanie zmian Kreatora zdarzeń dla zdarzeń niestandardowych

Po dodaniu zdarzenia niestandardowego Kreator dodawania zdarzeń wprowadza zmiany w klasie kontrolki . H. CPP i . Pliki IDL. Poniższe przykłady kodu są specyficzne dla zdarzenia ClickIn.

Następujące wiersze są dodawane do nagłówka (. H) plik klasy kontrolnej:

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

Ten kod deklaruje funkcję śródliniową o nazwie FireClickIn , która wywołuje COleControl::FireEvent ze zdarzeniem ClickIn i parametrami zdefiniowanymi za pomocą Kreatora dodawania zdarzeń.

Ponadto następujący wiersz jest dodawany do mapy zdarzeń dla kontrolki znajdującej się w implementacji (. Plik CPP klasy kontrolnej:

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

Ten kod mapuje zdarzenie ClickIn do funkcji FireClickInwbudowanej , przekazując parametry zdefiniowane za pomocą Kreatora dodawania zdarzeń.

Na koniec następujący wiersz zostanie dodany do kontrolki . Plik IDL:

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

Ten wiersz przypisuje zdarzenie ClickIn określony numer identyfikatora pobranego z pozycji zdarzenia na liście zdarzeń Dodaj kreatora zdarzeń. Wpis na liście zdarzeń umożliwia kontenerowi przewidywanie zdarzenia. Na przykład może on dostarczyć kod procedury obsługi, który ma zostać wykonany po uruchomieniu zdarzenia.

Wywoływanie funkcji FireClickIn

Teraz, po dodaniu zdarzenia niestandardowego ClickIn przy użyciu Kreatora dodawania zdarzeń, musisz zdecydować, kiedy to zdarzenie ma zostać wyzwolone. W tym celu należy wywołać wywołanie FireClickIn odpowiedniej akcji. W tej dyskusji kontrolka używa InCircle funkcji wewnątrz WM_LBUTTONDOWN programu obsługi komunikatów w celu uruchomienia zdarzenia ClickIn, gdy użytkownik kliknie wewnątrz cyklicznego lub wielokropka. Poniższa procedura dodaje procedurę WM_LBUTTONDOWN obsługi.

Aby dodać procedurę obsługi komunikatów za pomocą Kreatora dodawania zdarzeń

  1. Załaduj projekt kontrolki.

  2. W widoku klasy wybierz klasę kontrolki ActiveX.

  3. W oknie Właściwości zostanie wyświetlona lista komunikatów, które mogą być obsługiwane przez kontrolkę ActiveX. Każdy komunikat wyświetlany pogrubioną ma już przypisaną funkcję obsługi.

  4. Wybierz komunikat, który chcesz obsłużyć. W tym przykładzie wybierz pozycję WM_LBUTTONDOWN.

  5. W polu listy rozwijanej po prawej stronie wybierz pozycję <Dodaj> OnLButtonDown.

  6. Kliknij dwukrotnie nową funkcję obsługi w widoku klasy, aby przejść do kodu procedury obsługi komunikatów w implementacji (. Plik CPP kontrolki ActiveX.

Poniższy przykładowy kod wywołuje InCircle funkcję za każdym razem, gdy lewy przycisk myszy jest klikany w oknie sterowania. Ten przykład można znaleźć w WM_LBUTTONDOWN funkcji obsługi , OnLButtonDownw abstrakcie Circ .

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

   COleControl::OnLButtonDown(nFlags, point);
}

Uwaga

Gdy Kreator dodawania zdarzeń tworzy programy obsługi komunikatów dla akcji przycisku myszy, zostanie automatycznie dodane wywołanie tej samej procedury obsługi komunikatów klasy bazowej. Nie usuwaj tego wywołania. Jeśli kontrolka używa dowolnego z komunikatów myszy, programy obsługi komunikatów w klasie bazowej muszą być wywoływane, aby upewnić się, że przechwytywanie myszy jest prawidłowo obsługiwane.

W poniższym przykładzie zdarzenie jest uruchamiane tylko wtedy, gdy kliknięcie występuje wewnątrz cyklicznego lub wielokropkowego regionu w kontrolce. Aby osiągnąć to zachowanie, możesz umieścić InCircle funkcję w implementacji kontrolki (. Plik CPP):

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

Należy również dodać następującą deklarację InCircle funkcji do nagłówka kontrolki (. Plik H):

VARIANT_BOOL InCircle(CPoint& point);

Zdarzenia niestandardowe z nazwami giełdowymi

Zdarzenia niestandardowe można tworzyć o tej samej nazwie co zdarzenia magazynowe, jednak nie można zaimplementować obu tych zdarzeń w tej samej kontrolce. Na przykład możesz utworzyć zdarzenie niestandardowe o nazwie Kliknij, które nie jest uruchamiane, gdy zdarzenie akcji Kliknij normalnie zostanie wyzwolony. Następnie w dowolnym momencie można uruchomić zdarzenie Click, wywołując jego funkcję wypalania.

Poniższa procedura dodaje niestandardowe zdarzenie kliknięcia.

Aby dodać zdarzenie niestandardowe, które używa nazwy zdarzenia giełdowego

  1. Załaduj projekt kontrolki.

  2. W widoku klasy kliknij prawym przyciskiem myszy klasę kontrolki ActiveX, aby otworzyć menu skrótów.

  3. W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj zdarzenie.

    Spowoduje to otwarcie Kreatora dodawania zdarzeń.

  4. Z listy rozwijanej Nazwa zdarzenia wybierz nazwę zdarzenia giełdowego. W tym przykładzie wybierz pozycję Kliknij.

  5. W polu Typ zdarzenia wybierz pozycję Niestandardowe.

  6. Kliknij przycisk Zakończ , aby utworzyć zdarzenie.

  7. Wywołaj odpowiednie FireClick miejsca w kodzie.

Zobacz też

Kontrolki ActiveX MFC
Kontrolki ActiveX MFC: metody
Klasa COleControl