Обеспечение взаимодействия с мышью в неактивном режиме
Если элемент управления не активирован немедленно, может потребоваться обрабатывать WM_SETCURSOR и WM_MOUSEMOVE сообщения, даже если элемент управления не имеет собственного окна. Это можно сделать, включив COleControl
реализацию IPointerInactive
интерфейса, которая отключена по умолчанию. (См. раздел Пакет SDK ActiveX для описания этого интерфейса.) Чтобы включить его, включите флаг pointerInactive в набор флагов, возвращаемых COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}
Код для включения этого флага создается автоматически при выборе уведомлений указателя мыши при неактивном параметре на странице "Элемент управления Параметры" при создании элемента управления с помощью мастера управления ActiveX MFC.
IPointerInactive
Если интерфейс включен, контейнер делегирует WM_SETCURSOR и WM_MOUSEMOVE сообщения. COleControl
Реализация отправки IPointerInactive
сообщений через карту сообщений элемента управления после корректировки координат мыши соответствующим образом. Вы можете обработать сообщения так же, как обычные сообщения окна, добавив соответствующие записи в карту сообщений. В обработчиках этих сообщений не используйте переменную члена 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;