Zapewnianie interakcji z myszą przy braku aktywności

Jeśli kontrolka nie została natychmiast aktywowana, nadal może być konieczne przetworzenie WM_SETCURSOR i WM_MOUSEMOVE komunikatów, mimo że kontrolka nie ma własnego okna. Można to zrobić, włączając COleControlimplementację interfejsu IPointerInactive , który jest domyślnie wyłączony. (Zobacz Zestaw ActiveX SDK zawiera opis tego interfejsu). Aby ją włączyć, dołącz flagę wskaźnikaInactive w zestawie flag zwróconych przez COleControl::GetControlFlags:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}

Kod dołączania tej flagi jest generowany automatycznie, jeśli podczas tworzenia kontrolki za pomocą Kreatora kontrolek ActiveX MFC zostanie wybrana opcja Powiadomienia wskaźnika myszy po nieaktywnej stronie Kontrolka Ustawienia.

Po włączeniu interfejsu IPointerInactive kontener deleguje WM_SETCURSOR i WM_MOUSEMOVE do niego komunikaty. COleControlImplementacja wysyłania komunikatów przez mapę komunikatów IPointerInactive kontrolki po odpowiednim dostosowaniu współrzędnych myszy. Komunikaty można przetwarzać tak samo jak zwykłe komunikaty okien, dodając odpowiednie wpisy do mapy komunikatów. W programach obsługi tych komunikatów należy unikać używania zmiennej składowej m_hWnd (lub dowolnej funkcji składowej korzystającej z niej) bez wcześniejszego sprawdzenia, czy jej wartość nie ma wartości NULL.

Możesz również chcieć, aby nieaktywna kontrolka stanowiła element docelowy operacji przeciągania i upuszczania OLE. Wymaga to aktywowania kontrolki w momencie przeciągania obiektu przez użytkownika, aby okno kontrolki można było zarejestrować jako cel upuszczania. Aby spowodować wystąpienie aktywacji podczas przeciągania, zastąpij COleControl::GetActivationPolicy i zwróć flagę POINTERINACTIVE_ACTIVATEONDRAG:

DWORD CMyAxOptCtrl::GetActivationPolicy()
{
   return POINTERINACTIVE_ACTIVATEONDRAG;
}

Włączenie interfejsu IPointerInactive zwykle oznacza, że kontrolka ma być w stanie przetwarzać komunikaty myszy przez cały czas. Aby uzyskać to zachowanie w kontenerze, który nie obsługuje interfejsu IPointerInactive , musisz zawsze aktywować kontrolkę, gdy jest widoczna, co oznacza, że kontrolka powinna zawierać flagę OLEMISC_ACTIVATEWHENVISIBLE wśród różnych flag. Jednak aby zapobiec wystąpieniu tej flagi w kontenerze, który obsługuje IPointerInactive, można również określić flagę OLEMISC_IGNOREACTIVATEWHENVISIBLE:

static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;

Zobacz też

Kontrolki ActiveX MFC: optymalizacja