自定義事件與內建事件不同,因為它們不會由 類別 COleControl自動引發。 自定義事件會將控件開發人員決定的特定動作辨識為事件。 自定義事件的事件對應項目是由EVENT_CUSTOM巨集表示。 下一節會針對使用 ActiveX 控制件精靈建立的 ActiveX 控件項目實作自定義事件。
使用 [新增事件精靈] 新增自定義事件
下列程式會新增特定的自定義事件 ClickIn。 您可以使用此程式來新增其他自訂事件。 將自定義事件名稱和其參數取代為 ClickIn 事件名稱和參數。
使用 [新增事件精靈] 新增 ClickIn 自定義事件
載入您的控件專案。
在 [類別檢視] 中,以滑鼠右鍵按下您的 ActiveX 控件類別,以開啟快捷方式功能表。
從快捷方式功能表中,按兩下 [ 新增 ],然後按下 [ 新增事件]。
這會開啟 [新增事件精靈]。
在 [ 事件名稱] 方塊中,先選取任何現有的事件,然後按兩下 [ 自定義 ] 單選按鈕,然後輸入 ClickIn。
在 [ 內部名稱] 方塊中,輸入事件引發函式的名稱。 在此範例中,請使用 [新增事件精靈] 所提供的預設值 (
FireClickIn)。使用 [參數名稱] 和 [參數類型] 控件,新增名為 xCoord 的參數(類型OLE_XPOS_PIXELS]。
新增第二個參數,稱為 yCoord (類型 OLE_YPOS_PIXELS)。
按兩下 [完成 ] 以建立事件。
新增自定義事件的事件精靈變更
當您新增自訂事件時,[新增事件精靈] 會變更控制項類別 。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 處理程式。
借助[新增事件精靈]來新增訊息處理程式
載入您的控件專案。
在 [類別檢視] 中,選取您的 ActiveX 控件類別。
在 [ 屬性 ] 視窗中,您會看到 ActiveX 控制件可以處理的訊息清單。 以粗體顯示的任何訊息,都已將處理程式函式指派給它。
選取您想要處理的訊息。 在這裡範例中,選取
WM_LBUTTONDOWN。從右側的下拉式清單框中,選取 <[新增> OnLButtonDown]。
按兩下 類別檢視 中的新處理程式函式,以跳至您的 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 事件。
若要新增使用內建事件名稱的自訂事件
載入您的控件專案。
在 [類別檢視] 中,以滑鼠右鍵按下您的 ActiveX 控件類別,以開啟快捷方式功能表。
從快捷方式功能表中,按兩下 [ 新增 ],然後按下 [ 新增事件]。
這會開啟 [新增事件精靈]。
在 [ 事件名稱] 下拉式清單中,選取股票事件名稱。 在此範例中,選取 按一下。
針對 [事件類型],選取 [ 自定義]。
按兩下 [完成 ] 以建立事件。
在程式代碼的適當位置呼叫
FireClick。