MFC ActiveX 控制項: 將自訂事件
自訂事件與不同內建事件類別不會自動引發的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 ,以呼叫 COleControl::FireEvent 參數之 ClickIn 事件與您使用 [定義加入事件精靈。
另外下, 面這一行加入控制項,在實作中的事件對應 (。Cpp) 的控制項類別:
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 事件特定的 ID 號碼,取自加入事件精靈事件清單中的事件的位置。[事件] 清單中的項目允許容器預測事件。比方說,也可能會提供要引發事件時執行的處理常式程式碼。
呼叫 FireClickIn
既然您已加入 ClickIn 自訂事件,使用加入事件精靈,您必須決定要引發此事件時。您只要呼叫FireClickIn適當的動作就會發生。這個討論而言,控制項就會使用InCircle函式內WM_LBUTTONDOWN訊息處理常式來引發 ClickIn 事件,當使用者按一下圓形或橢圓形區域內。下列程序會加入WM_LBUTTONDOWN處理常式。
若要使用加入事件精靈加入訊息處理常式
載入控制項專案。
在 [類別檢視中,選取您的 ActiveX 控制項類別。
在 [屬性] 視窗中,按一下 [訊息] 按鈕。
[屬性] 視窗會顯示一份由 ActiveX 控制項,可以處理的訊息。郵件已經以粗體顯示後指派給它的處理函式。
從 [屬性] 視窗中,選取您想要處理的訊息。這個範例中,選取 [ WM_LBUTTONDOWN。
從右邊下拉式清單方塊中選取 <Add> OnLButtonDown。
連按兩下以跳至訊息處理常式程式碼,在實作中的 [類別檢視] 中的新處理函式 (。CPP) 檔案中有您 ActiveX 的控制項。
下列程式碼範例呼叫 InCircle 函式每次在控制項視窗中按下滑鼠左鍵。這個範例可以在中找到WM_LBUTTONDOWN事件的事件處理常式, OnLButtonDown,請在 Circ 範例抽象。
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在程式碼中的適當位置。