Zajištění interakce s myší v neaktivním stavu
Pokud ovládací prvek není okamžitě aktivován, stále můžete jej Zpracovat WM_SETCURSOR a WM_MOUSEMOVE , i když ovládací prvek nemá žádné okno zprávy.To lze provést povolením COleControlna provádění IPointerInactive rozhraní, které je ve výchozím nastavení zakázána. (Viz ActiveX SDK popis tohoto rozhraní.) Patří k tomu, pointerInactive příznak v sadě vrácené příznaky COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
...
return dwFlags;
}
Kód, který bude obsahovat tento příznak je automaticky generováno při výběru Myši ukazatel oznámení při aktivní možnost na Nastavení ovládacího prvku stránky při vytváření vašeho ovládacího prvku společně MFC ActiveX Control Wizard.
Když IPointerInactive rozhraní je povoleno, delegáti kontejner WM_SETCURSOR a WM_MOUSEMOVE zprávy k němu.COleControlna provádění IPointerInactive odešle zprávy prostřednictvím ovládacího prvku mapu zpráv po nastavení myši správně souřadnice.Přidáním odpovídající položky mapování zpráv dokáže zpracovat zprávy stejně jako běžná okna zprávy.Vaše obslužné rutiny pro tyto zprávy, vyhněte se použití m_hWnd členské proměnné (nebo členskou funkci, která jej používá) bez první kontroly jeho hodnota není NULL.
Můžete také ovládací prvek neaktivní cíl operace a přetažení OLE.To vyžaduje aktivaci ovládacího prvku v okamžiku, kdy uživatel přetáhne objekt nad ním, takže okno ovládacího prvku může být registrován jako cíl přetažení.Způsobí aktivaci dochází během tažení, přepsat COleControl::GetActivationPolicya vrátit se POINTERINACTIVE_ACTIVATEONDRAG vlajky:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Povolení IPointerInactive rozhraní obvykle znamená, že ovládací prvek schopný zpracovávat zprávy myš za všech okolností.Chcete-li získat toto chování v kontejneru, který nepodporuje IPointerInactive rozhraní, musí být ovládací prvek vždy aktivována, když je viditelná, což znamená ovládacího prvku by měl zahrnovat OLEMISC_ACTIVATEWHENVISIBLE příznak mezi jeho různé příznaky.Však chcete-li zabránit tento příznak z nabude účinku v kontejneru, který podporuje IPointerInactive, můžete také zadat OLEMISC_IGNOREACTIVATEWHENVISIBLE příznak:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;