Поделиться через


Обеспечение взаимодействия с мышью в неактивном режиме

Если элемент управления непосредственно не активирован, может также потребоваться его процесса WM_SETCURSOR и сообщения WM_MOUSEMOVE, даже если элемент управления не имеет окно его. Это может выполняться путем включения реализацию COleControl интерфейса IPointerInactive, запрещен по умолчанию. (См. ActiveX SDK для описания данного интерфейса). Чтобы включить его, включите флажок 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 на него. реализация COleControlIPointerInactive диспетчеризация сообщений по схеме сообщений элемента управления после изменения координаты мыши соответствующим образом. Процесс взаимодействия можно так же, как и обычные сообщения окна, добавив соответствующие записи в схеме сообщений. В обработчиках для этих сообщений, избегайте использования переменной 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;

См. также

Основные понятия

Элементы управления ActiveX в MFC. Оптимизация