Partilhar via


Fornecendo interação com o mouse enquanto inativo

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

Quando a IPointerInactive interface está ativada, o contêiner delega as mensagens WM_SETCURSOR e WM_MOUSEMOVE para ela. A implementação do COleControl despacha as mensagens através do mapa de mensagens do seu controlo depois de ajustar as coordenadas do mouse adequadamente. Você pode processar as mensagens como mensagens de janela comuns, adicionando as entradas correspondentes ao mapa de mensagens. Em seus manipuladores para essas mensagens, evite usar a variável de membro m_hWnd (ou qualquer função de membro que a use) sem primeiro verificar se seu valor não é NULL.

Você pode também desejar que um controlo inativo seja o alvo de uma operação de arrastar e soltar OLE. Isto requer ativar o controlo no momento em que o utilizador arrasta um objeto sobre ele, para que a janela do controlo possa ser registada como um alvo de soltura. Para fazer com que a ativação ocorra durante um arrasto, substitua COleControl::GetActivationPolicy e devolva o sinalizador POINTERINACTIVE_ACTIVATEONDRAG:

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

Habilitar a IPointerInactive interface normalmente 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 IPointerInactive interface, você precisa ter seu controle sempre ativado quando visível, o que significa que o controle deve incluir o sinalizador OLEMISC_ACTIVATEWHENVISIBLE entre seus sinalizadores diversos. No entanto, para evitar que esse sinalizador entre em vigor em um contêiner que ofereça suporte ao 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;

Ver também

Controles ActiveX MFC: Otimização