不活动时提供鼠标交互

如果控件并未立即激活,您可能仍在处理 WM_SETCURSORWM_MOUSEMOVE 消息,即使控件,没有自己的窗口。 可以通过启用 IPointerInactive 接口的 COleControl 实现来完成,默认情况下将禁用。(为此接口的说明,请参见 ActiveX SDK 。)若要启用该身份,包含在组的 pointerInactive 标志。COleControl::GetControlFlags返回:

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


...


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


...


   return dwFlags;
}

为包含此标记的代码自动生成,则选择 控件设置 页中的 不活动时有鼠标指针通知 (M) 选项,当创建具有 MFC ActiveX 控件向导时控件。

IPointerInactive 接口启用时,容器将 WM_SETCURSORWM_MOUSEMOVE 消息。它。 IPointerInactiveCOleControl 实现通过控件的消息映射调度消息。相应调整鼠标坐之后。 可以通过将添加相应的项处理消息像操作普通窗口消息至消息映射。 在这些消息的处理程序,应避免使用 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 控件:优化