非作用中時提供滑鼠互動
如果未立即啟動您的控制項,您可能仍然要它處理WM_SETCURSOR和WM_MOUSEMOVE的郵件,即使控制項有沒有自己的視窗。這可藉由啟用COleControl的實作IPointerInactive介面,預設會停用。(請參閱 ActiveX SDK 如需這個介面的描述。)若要啟用它,請包括pointerInactive旗標所傳回的集合中的旗標 COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
...
return dwFlags;
}
如果您選取 [自動產生程式碼中包含這個旗標滑鼠指標告知時閒置 選項在 控制設定 頁面建立您的控制項與時 MFC ActiveX 控制項精靈。
當IPointerInactive啟用介面時,容器委派WM_SETCURSOR和WM_MOUSEMOVE給它的訊息。COleControl實作IPointerInactive分派到控制項的訊息對應的訊息之後會適當地調整滑鼠座標。您可以藉由加入對應的項目加入訊息對應處理就如同一般視窗訊息的訊息。在這些訊息的處理常式,請避免使用m_hWnd成員變數 (或任何使用它的成員函式) 不需事先查看它的值不 NULL。
您也可以作用中的控制項成為 OLE 拖放作業的目標。這需要控制項時啟動在使用者拖曳物件時的那一刻起,使控制項的視窗就可註冊為置放目標。若要引發啟動發生在拖曳時,會覆寫 COleControl::GetActivationPolicy,並傳回 POINTERINACTIVE_ACTIVATEONDRAG 旗標:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
啟用IPointerInactive介面通常表示您想要控制項能夠永遠處理滑鼠訊息。若要取得這種情形並不支援的容器中IPointerInactive介面,您必須要有您的控制項時,可以看得到,永遠啟動這表示控制項應該包含 OLEMISC_ACTIVATEWHENVISIBLE 在它的其他旗標之間的旗標。然而,若要避免這個旗標從生效的容器,並支援IPointerInactive,您也可以指定 OLEMISC_IGNOREACTIVATEWHENVISIBLE 旗標:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;