提供鼠标交互,当非活动任务时

如果不会立即激活您的控件时,您可能仍在处理 WM_SETCURSORWM_MOUSEMOVE 消息,因此,即使控件没有自己的窗口。 这可以通过启用 IPointerInactive 接口的 entity_CODECOleControl 的实现来完成,默认情况下禁用。 (对于此接口的说明,参见 ActiveX SDK 。)若要启用它,请包括 pointerInactive 标志。 COleControl::GetControlFlags返回的一组标志:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();


...


// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;


...


   return dwFlags;
}

包含此标志的代码自动生成,如果选择在 控件设置 页的 Mouse Pointer Notifications When Inactive 选项,则创建自己的控件。 MFC ActiveX Control Wizard时。

IPointerInactive 接口启用时,容器将 WM_SETCURSORWM_MOUSEMOVE 消息给它。 IPointerInactive 的 entity_CODECOleControl 的实现通过控件的消息映射调度消息在相应调整鼠标坐之后。 您可以通过将对应项处理消息类似普通的 windows 消息传送到消息映射。 在您的这些消息的处理程序,请避免使用 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;

请参见

概念

MFC ActiveX 控件:优化