Fornecendo Mouse interação enquanto inativo
Se o controle não é ativado imediatamente, talvez ainda queira processar WM_SETCURSOR e WM_MOUSEMOVE mensagens, mesmo que o controle não tem nenhuma janela própria.Isso pode ser feito habilitando COleControlda implementação do IPointerInactive interface é desabilitado por padrão.(Consulte o ActiveX SDK para obter uma descrição desta interface.) Para habilitá-la, inclua o pointerInactive sinalizador no conjunto de sinalizadores retornado 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 o Mouse ponteiro notificações quando inativo opção no Configurações de controle página quando criar o controle com o MFC Assistente de controle de ActiveX.
Quando o IPointerInactive interface é ativada, os representantes do contêiner WM_SETCURSOR e WM_MOUSEMOVE mensagens para ele.COleControlda implementação de IPointerInactive envia mensagens através do mapa da mensagem do controle depois de ajustar o mouse coordenadas adequadamente.Você pode processar as mensagens como mensagens de janela normal, adicionando as entradas correspondentes ao mapa da mensagem.Seus manipuladores para essas mensagens, evite usar o m_hWnd variável de membro (ou qualquer função de membro usa) sem verificar primeiro que seu valor não é Nulo.
Você também poderá um controle inativo para ser 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, para que a janela do controle pode ser registrada como um destino de soltar.Para fazer com que a ativação ocorrer durante uma operação arrastar, substituir COleControl::GetActivationPolicye retornar o POINTERINACTIVE_ACTIVATEONDRAG sinalizador:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Ativando o IPointerInactive interface normalmente significa que você deseja que o controle seja capaz de processar mensagens do mouse em todos os momentos.Para obter esse comportamento em um recipiente que não oferece suporte a IPointerInactive interface, você precisará ter o controle sempre ativado quando visível, que significa que o controle deve incluir o OLEMISC_ACTIVATEWHENVISIBLE sinalizador entre seus diversos sinalizadores.No entanto, para evitar que esse sinalizador de efeito em um recipiente que suporte IPointerInactive, você também pode especificar o OLEMISC_IGNOREACTIVATEWHENVISIBLE sinalizador:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;