Zajištění interakce s myší v neaktivním stavu
Pokud se ovládací prvek neaktivuje okamžitě, můžete chtít, aby zpracovával WM_SETCURSOR a WM_MOUSEMOVE zprávy, i když ovládací prvek nemá vlastní okno. Toho lze dosáhnout povolením COleControl
implementace IPointerInactive
rozhraní, která je ve výchozím nastavení zakázaná. (Viz technologie ActiveX SDK pro popis tohoto rozhraní.) Pokud ji chcete povolit, zahrňte příznak pointerInactive do sady příznaků vrácených COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}
Kód, který má tento příznak zahrnout, se automaticky vygeneruje, pokud při vytváření ovládacího prvku pomocí Průvodce ovládacím technologie ActiveX ovládacím prvku MFC vyberete možnost Oznámení ukazatele myši Při neaktivní možnosti na stránce Ovládací prvek Nastavení.
IPointerInactive
Když je rozhraní povolené, kontejner na něj WM_SETCURSOR a WM_MOUSEMOVE zprávy. COleControl
Implementace IPointerInactive
odesílání zpráv přes mapu zpráv ovládacího prvku po odpovídající úpravě souřadnic myši. Zprávy můžete zpracovat stejně jako běžné zprávy okna přidáním odpovídajících položek do mapy zpráv. V obslužných rutinách pro tyto zprávy nepoužívejte m_hWnd členské proměnné (nebo jakékoli členské funkce, která ji používá) bez první kontroly, že její hodnota není NULL.
Můžete také chtít, aby neaktivní ovládací prvek byl cílem operace přetažení a přetažení OLE. To vyžaduje aktivaci ovládacího prvku v okamžiku, kdy uživatel přetáhne objekt, aby bylo možné zaregistrovat okno ovládacího prvku jako cíl přetažení. Pokud chcete způsobit aktivaci během přetažení, přepište COleControl::GetActivationPolicy a vraťte příznak POINTERINACTIVE_ACTIVATEONDRAG:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
IPointerInactive
Povolení rozhraní obvykle znamená, že chcete, aby ovládací prvek mohl zpracovávat zprávy myši vždy. Pokud chcete toto chování získat v kontejneru, který nepodporuje IPointerInactive
rozhraní, musíte mít ovládací prvek vždy aktivovaný, když je viditelný, což znamená, že ovládací prvek by měl obsahovat příznak OLEMISC_ACTIVATEWHENVISIBLE mezi jeho různé příznaky. Pokud ale chcete zabránit tomu, aby se tento příznak projevil v kontejneru, který podporuje IPointerInactive
, můžete také zadat příznak OLEMISC_IGNOREACTIVATEWHENVISIBLE:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;