COleControl::GetActivationPolicy
virtual DWORD GetActivationPolicy( );
返回值:
POINTERINACTIVE枚举的标志组合。可能的标志是:
·
POINTERINACTIVE_ACTIVATEONENTRY
移动鼠标操作期间,当鼠标移到对象中时,必须将对象激活。
·
POINTERINACTIVE_DEACTIVATEONLEAVE
移动鼠标操作期间,当鼠标移开对象时,必须将对象变成被活动的。
·
POINTERINACTIVE_ACTIVATEONDRAG
拖放操作期间,当鼠标拖拉、该对象时,必须将对象激活。
说明:
若要改变支持IPointerInactive界面的控件的缺省激活行为,可覆盖该函数。
当IPointerInactive界面有效时,控件会将WM_SETCURSOR和WM_MOUSEMOVE转发给它。COleControl实现该界面时将会在适当调校鼠标坐标后,通过控件的消息映射表将分派这些消息。
一旦包容器接收到WM_SETCURSOR或WM_MOUSEMOVE,而且鼠标指向一个支持 IPointerInactive的非活动对象时,它会在界面上调用GetActivationPolicy然后返回POINTERINACTIVE枚举的标志。
可以在消息映射表中增加相应的入口点,同其它的窗口消息一样来处理这些消息。在你的消息处理函数中,应该避免在检查m_hWnd值为非NULL时使用m_hWnd成员变量(或使用该成员变量的任何成员函数)。
如果一个对象想在设置鼠标光标和/或触发鼠标移动事件以外,进行更多的鼠标处理操作,例如给出特别的可视反馈,必须返回POINTERINACTIVE_ACTIVATEONENTRY标志,并且只能在活动时进行反馈。
如果对象返回该标志,包容器必须立即激活该对象,然后向它发出相同的消息以触发对GetActivationPolicy的调用。
如果同时返回POINTERINACTIVE_ACTIVATEONENTRY和POINTERIN ACTIVE_DEACTIVATEONLEAVE 标志,那么对象只能在鼠标移到时才能被激活。如果仅返回POINTERINACTIVE_ACTIVATEONENTRY 标志,该对象仅在鼠标第一次进入对象时被激活。
有时可能要将一个非活动控件作为一次OLE拖放操作的目标。这要求在用户拖拉控件时激活控件,以便将控件窗口注册为一个放下的目标。要在拖拉时激活控件,则返回POINTERINACTIVE_ACTIVATEONDRAG标志:
DWORD CMyCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
GetActivationPolicy通讯的信息必须由包容器进行缓冲。否则,该方法必须在每一次鼠标进入非活动对象时调用。
如果一个非活动对象在鼠标进入时不要求被激活,它的包容器必须在鼠标停留在对象上时调用OnInactiveSetCursor向该对象分派持续的WM_SETCURSOR消息。
使IPointerInactive界面有效通常意味着使控件在任何时候具有处理鼠标消息的能力。如果不支持IPointerInactive界面,那么需要使你的控件自始至终都处于活动状态才能处理鼠标消息,这意味着控件必须具有OLEMISC_ACTIV ATEWHENVISIBLE标志。然而,为避免该标志影响支持IPointerInactive的包容器,你还要指定OLEMISC_IGNOREACTIVATEWHENVISIBLE标志:
static const DWORD BASED_CODE _dwMyOleMisc = OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
请参阅:
COleControl::OnInactiveSetCursor
,
COleControl::OnInactiveMouseMove