共用方式為


MFC ActiveX 控制件:新增自定義事件

自定義事件與內建事件不同,因為它們不會由 類別 COleControl自動引發。 自定義事件會將控件開發人員決定的特定動作辨識為事件。 自定義事件的事件對應項目是由EVENT_CUSTOM巨集表示。 下一節會針對使用 ActiveX 控制件精靈建立的 ActiveX 控件項目實作自定義事件。

使用 [新增事件精靈] 新增自定義事件

下列程式會新增特定的自定義事件 ClickIn。 您可以使用此程式來新增其他自訂事件。 將自定義事件名稱和其參數取代為 ClickIn 事件名稱和參數。

使用 [新增事件精靈] 新增 ClickIn 自定義事件

  1. 載入您的控件專案。

  2. [類別檢視] 中,以滑鼠右鍵按下您的 ActiveX 控件類別,以開啟快捷方式功能表。

  3. 從快捷方式功能表中,按兩下 [ 新增 ],然後按下 [ 新增事件]。

    這會開啟 [新增事件精靈]。

  4. 在 [ 事件名稱] 方塊中,先選取任何現有的事件,然後按兩下 [ 自定義 ] 單選按鈕,然後輸入 ClickIn

  5. 在 [ 內部名稱] 方塊中,輸入事件引發函式的名稱。 在此範例中,請使用 [新增事件精靈] 所提供的預設值 (FireClickIn)。

  6. 使用 [參數名稱] 和 [參數類型] 控件,新增名為 xCoord 的參數(類型OLE_XPOS_PIXELS]。

  7. 新增第二個參數,稱為 yCoord (類型 OLE_YPOS_PIXELS)。

  8. 按兩下 [完成 ] 以建立事件。

新增自定義事件的事件精靈變更

當您新增自訂事件時,[新增事件精靈] 會變更控制項類別 。H, .CPP 和 。IDL 檔案。 下列程式代碼範例專屬於 ClickIn 事件。

下列幾行會新增至控制類別的標頭 (.H) 檔案:

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

此程式代碼會宣告名為 FireClickIn 的內嵌函式,其會使用 ClickIn 事件和您使用 [新增事件精靈] 定義的參數呼叫 COleControl::FireEvent

此外,下列這一行將新增至您控制項類別的實作檔案(.CPP)中的事件映射:

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

此程式代碼會將事件 ClickIn 對應至內嵌函式 FireClickIn,傳遞您使用 [新增事件精靈] 定義的參數。

最後,下列這一行會新增至控件的 。IDL 檔案:

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

這一行會指派 ClickIn 事件特定標識符,該號碼取自 [新增事件精靈] 事件清單中的事件位置。 事件清單中的條目可讓容器預期事件。 例如,它可能會提供引發事件時要執行的處理程序代碼。

呼叫 FireClickIn

現在您已使用 [新增事件精靈] 新增 ClickIn 自定義事件,您必須決定此事件應被觸發的時機。 您可以在適當的動作發生時呼叫 FireClickIn 來執行此動作。 在此討論中,當使用者按兩下圓形或橢圓形區域內時,控件會使用 InCircle 訊息處理程式內的 WM_LBUTTONDOWN 函式來引發 ClickIn 事件。 下列程序將新增 WM_LBUTTONDOWN 處理程式。

借助[新增事件精靈]來新增訊息處理程式

  1. 載入您的控件專案。

  2. [類別檢視] 中,選取您的 ActiveX 控件類別。

  3. 在 [ 屬性 ] 視窗中,您會看到 ActiveX 控制件可以處理的訊息清單。 以粗體顯示的任何訊息,都已將處理程式函式指派給它。

  4. 選取您想要處理的訊息。 在這裡範例中,選取 WM_LBUTTONDOWN

  5. 從右側的下拉式清單框中,選取 <[新增> OnLButtonDown]。

  6. 按兩下 類別檢視 中的新處理程式函式,以跳至您的 ActiveX 控制項的實作 (.CPP) 檔案中的訊息處理程式代碼。

下列程式代碼範例會在每次按下控件視窗內的滑鼠左鍵時呼叫 InCircle 函式。 您可以在 WM_LBUTTONDOWN抽象的處理程式函OnLButtonDown式中找到這個範例。

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

   COleControl::OnLButtonDown(nFlags, point);
}

備註

當 [新增事件精靈] 建立滑鼠按鈕動作的訊息處理程式時,會自動新增對基類相同訊息處理程式的呼叫。 請勿移除此呼叫。 如果您的控件使用任何預設滑鼠訊息,則必須呼叫基類訊息處理器,以確保正確處理滑鼠捕捉。

在下列範例中,只有當點擊發生在控制項內的圓形或橢圓形區域內時,事件才會被觸發。 若要達成此行為,您可以將函式 InCircle 放在控制項的實作檔案(.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);
}

您還需要將以下 InCircle 函數的宣告新增到控制項的標頭 (.H) 檔案中:

VARIANT_BOOL InCircle(CPoint& point);

具有股票名稱的自定義事件

您可以使用與庫存事件相同的名稱來建立自定義事件,不過您無法在相同的控件中實作這兩個事件。 例如,您可能想要建立一個名為 Click 的自定義事件,而這個事件不會在預設的 Click 事件應該觸發時被觸發。 接著,您可以隨時呼叫其觸發函式來引發 Click 事件。

下列程序會新增自訂的 Click 事件。

若要新增使用內建事件名稱的自訂事件

  1. 載入您的控件專案。

  2. [類別檢視] 中,以滑鼠右鍵按下您的 ActiveX 控件類別,以開啟快捷方式功能表。

  3. 從快捷方式功能表中,按兩下 [ 新增 ],然後按下 [ 新增事件]。

    這會開啟 [新增事件精靈]。

  4. 在 [ 事件名稱] 下拉式清單中,選取股票事件名稱。 在此範例中,選取 按一下

  5. 針對 [事件類型],選取 [ 自定義]。

  6. 按兩下 [完成 ] 以建立事件。

  7. 在程式代碼的適當位置呼叫 FireClick

另請參閱

MFC ActiveX 控制件
MFC ActiveX 控制件:方法
COleControl 類別