Compartilhar via


Fornecendo interação do mouse enquanto inativo

Se o controle não está ativado imediatamente, você pode ainda quiser WM_SETCURSOR e processar mensagens de WM_MOUSEMOVE , mesmo que o controle não tem nenhuma janela de seus próprios. Isso pode ser feito habilitando a implementação de COleControl da interface de IPointerInactive , que é desabilitada por padrão. (Consulte ActiveX SDK para obter uma descrição desta interface.) Para habilitá-lo, inclua o sinalizador de pointerInactive no conjunto de sinalizadores retornados por COleControl::GetControlFlags:

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


...


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


...


   return dwFlags;
}

O código para incluir esse sinalizador é gerado automaticamente se você selecionar a opção de Mouse Pointer Notifications When Inactive na página de Controle configurações ao criar seu controle com MFC ActiveX Control Wizard.

Quando a interface de IPointerInactive é habilitada, o contêiner delega-lhe WM_SETCURSOR e mensagens de WM_MOUSEMOVE . a implementação deCOleControl de IPointerInactive despacha as mensagens pelo mapa da mensagem do controle depois de definir as coordenadas do mouse em adequadamente. Você pode processar as mensagens exatamente como mensagens comuns da janela adicionando entradas correspondentes no mapa da mensagem. Nos manipuladores para essas mensagens, evite usar a variável de membro de m_hWnd (ou qualquer função de membro que o usar) sem verificar primeiro se o valor não é nulo.

Você também pode desejar que um controle inativa como o destino de uma operação de arrastar e soltar OLE. Isso requer ativar o controle no momento em que o usuário arrasta um objeto nele, de modo que a janela de controle pode ser registrada como um destino de descarte. Para fazer com que a ativação ocorre durante um arraste, substitua COleControl::GetActivationPolicy, e retornar o sinalizador de POINTERINACTIVE_ACTIVATEONDRAG :

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

Habilitar a interface de IPointerInactive geralmente significa que deseja controle para ser capaz de mensagens do mouse no processamento constantemente. Para obter esse comportamento em um contêiner que não oferece suporte à interface de IPointerInactive , você precisa ter seu controle ativado quando sempre visível, o que significa que o controle deve incluir o sinalizador de OLEMISC_ACTIVATEWHENVISIBLE entre os diversos sinalizadores. No entanto, para impedir esse sinalizador entre em vigor em um contêiner que oferece suporte IPointerInactive, você também pode especificar o sinalizador de OLEMISC_IGNOREACTIVATEWHENVISIBLE :

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

Consulte também

Conceitos

Controles ActiveX MFC: otimização