共用方式為


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 函式。 您可以在 Circ 範例抽象的處理常式函 OnLButtonDown 式中找到 WM_LBUTTONDOWN 這個範例

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 類別