Partilhar via


Fornecendo interação do mouse enquanto inativo

Se seu controle não for ativado imediatamente, você ainda pode querer processar mensagens WM_SETCURSOR e WM_MOUSEMOVE, mesmo que o controle não tenha janela própria. Isso pode ser feito ativando a implementação de COleControl da interface IPointerInactive, que é desativada por padrão. (Consulte o SDK ActiveX para obter uma descrição dessa interface). Para habilitá-la, inclua o sinalizador 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 será gerado automaticamente se você selecionar a opção Notificações do ponteiro do mouse quando estiver inativo na página Configurações de controle ao criar seu controle com o Assistente de Controle ActiveX do MFC.

Quando a interface IPointerInactive estiver habilitada, o contêiner delega mensagens WM_SETCURSOR e WM_MOUSEMOVE a ele. A implementação de COleControl de IPointerInactive envia as mensagens por meio do mapa de mensagens do controle, após ajustar as coordenadas do mouse adequadamente. Você pode processar as mensagens como mensagens de janela comuns adicionando as entradas correspondentes ao mapa da mensagem. Em seus manipuladores para essas mensagens, evite usar a variável de membro m_hWnd (ou qualquer função membro que a use) sem primeiro verificar se seu valor não é NULL.

Talvez também seja conveniente que um controle inativo seja o destino de uma operação de arrastar e soltar OLE. Isso requer a ativação do controle no momento em que o usuário arrasta um objeto sobre ele, para que a janela do controle possa ser registrada como um destino suspenso. Para que a ativação ocorra ao arrastar, substitua COleControl::GetActivationPolicy e retorne o sinalizador POINTERINACTIVE_ACTIVATEONDRAG:

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

Geralmente, habilitar a interface IPointerInactive significa que você deseja que o controle seja capaz de processar mensagens do mouse o tempo todo. Para obter esse comportamento em um contêiner que não suporta a interface IPointerInactive, seu controle precisa estar sempre ativado quando visível, o que significa que o controle deve incluir o sinalizador OLEMISC_ACTIVATEWHENVISIBLE entre seus diversos sinalizadores. No entanto, para evitar que esse sinalizador entre em vigor em um contêiner compatível com IPointerInactive, você também pode especificar o sinalizador OLEMISC_IGNOREACTIVATEWHENVISIBLE:

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

Confira também

Controles ActiveX do MFC: otimização