Compartilhar via


Controles ActiveX MFC: adicionando eventos personalizados

Os eventos personalizados diferem dos eventos de ações, pois eles não são disparados automaticamente pela classe COleControl. Um evento personalizado reconhece uma dada ação, determinada pelo desenvolvedor de controle, como um evento. As entradas do mapa de eventos para eventos personalizados são representadas pela macro EVENT_CUSTOM. A seção a seguir implementa um evento personalizado para um projeto de controle ActiveX criado usando o Assistente de Controle ActiveX.

Adicionar um evento personalizado com o Assistente para Adicionar Evento

O procedimento a seguir adiciona um evento personalizado específico, ClickIn. Você pode usar esse procedimento para adicionar outros eventos personalizados. Substitua o nome do evento personalizado e seus parâmetros pelo nome do evento ClickIn e parâmetros.

Para adicionar o evento personalizado ClickIn usando o Assistente para Adicionar Evento

  1. Carregue o projeto do controle.

  2. No Modo de Exibição de Classe, clique com o botão direito do mouse na classe de controle ActiveX para abrir o menu de atalho.

  3. No menu de atalho, clique em Adicionar e em Adicionar Evento.

    Isso abrirá o assistente Adicionar Evento.

  4. Na caixa Nome do Evento, selecione qualquer evento, clique no botão de opção Personalizado e digite ClickIn.

  5. Na caixa Nome interno, digite o nome da função de disparo do evento. Para este exemplo, use o valor padrão fornecido pelo Assistente para Adicionar Evento (FireClickIn).

  6. Adicione um parâmetro, chamado xCoord (tipo OLE_XPOS_PIXELS), usando os controles Nome do Parâmetro e Tipo de Parâmetro.

  7. Adicione um segundo parâmetro, chamado yCoord (tipo OLE_YPOS_PIXELS).

  8. Clique em Concluir para criar o evento.

Adicionar alterações do Assistente de Eventos para Eventos Personalizados

Quando você adiciona um evento personalizado, o Assistente para Adicionar Evento faz alterações aos arquivos .H, .CPP e .IDL da classe de controle. Os exemplos de código a seguir são específicos para o evento ClickIn.

As linhas a seguir são adicionadas ao arquivo (.H) de cabeçalho da classe de controle:

void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
   FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}

Esse código declara uma função embutida chamada FireClickInCOleControl::FireEvent com o evento ClickIn e parâmetros definidos usando o Assistente para Adicionar Evento.

Além disso, a seguinte linha é adicionada ao mapa de eventos para o controle, localizado no arquivo (.CPP) de implementação da classe de controle:

EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)

Esse código mapeia o evento ClickIn para a função FireClickIn embutida, passando os parâmetros definidos usando o Assistente para Adicionar Evento.

Por fim, a seguinte linha é adicionada ao arquivo .IDL de controle:

[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);

Essa linha atribui ao evento ClickIn um número de ID específico, retirado da posição do evento na lista de eventos Adicionar Assistente de Evento. A entrada na lista de eventos permite que um contêiner antecipe o evento. Por exemplo, ele pode fornecer código de manipulador a ser executado quando o evento é acionado.

Chamando FireClickIn

Agora que você adicionou o evento personalizado ClickIn usando o Assistente para Adicionar Evento, decida quando esse evento deve ser acionado. Você faz isso chamando FireClickIn quando a ação apropriada ocorre. Para essa discussão, o controle usa a função InCircle dentro de um manipulador de mensagens WM_LBUTTONDOWN para disparar o evento ClickIn quando um usuário clica dentro de uma região circular ou elíptica. O procedimento a seguir adiciona o manipulador WM_LBUTTONDOWN.

Para adicionar um manipulador de mensagens com o Assistente para Adicionar Evento

  1. Carregue o projeto do controle.

  2. No Modo de Exibição de Classe, selecione sua classe de controle ActiveX.

  3. Na janela Propriedades, você verá uma lista de mensagens que podem ser manipuladas pelo controle ActiveX. Qualquer mensagem mostrada em negrito já tem uma função de manipulador atribuída.

  4. Selecione a mensagem que você deseja manipular. Neste exemplo, selecione WM_LBUTTONDOWN.

  5. Na caixa de listagem suspensa à direita, selecione <Adicionar> OnLButtonDown.

  6. Clique duas vezes na nova função de manipulador no Modo de Exibição de Classe para ir para o código do manipulador de mensagens no arquivo (.CPP) da implementação do controle ActiveX.

O exemplo de código a seguir chama a função InCircle sempre que o botão esquerdo do mouse é clicado na janela de controle. Este exemplo pode ser encontrado na função de manipulador WM_LBUTTONDOWN, OnLButtonDown, no resumo de exemplo Circ.

void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   if (InCircle(point))
      FireClickIn(point.x, point.y);

   COleControl::OnLButtonDown(nFlags, point);
}

Observação

Quando o Assistente para Adicionar Evento cria manipuladores de mensagens para ações de botão do mouse, uma chamada para o mesmo manipulador de mensagens da classe base é adicionada automaticamente. Não remova essa chamada. Se o controle usar qualquer uma das mensagens do mouse de estoque, os manipuladores de mensagens na classe base deverão ser chamados para garantir que a captura do mouse seja tratada corretamente.

No exemplo a seguir, o evento é acionado somente quando o clique ocorre dentro de uma região circular ou elíptica dentro do controle. Para alcançar esse comportamento, você pode colocar a função InCircle na implementação do arquivo (.CPP) de controle:

VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
   CRect rc;
   GetClientRect(rc);
   // Determine radii
   double a = (rc.right - rc.left) / 2;
   double b = (rc.bottom - rc.top) / 2;

   // Determine x, y
   double x = point.x - (rc.left + rc.right) / 2;
   double y = point.y - (rc.top + rc.bottom) / 2;

   // Apply ellipse formula
   return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}

Você também precisará adicionar a seguinte declaração da função InCircle ao cabeçalho do arquivo (.H) de controle:

VARIANT_BOOL InCircle(CPoint& point);

Eventos personalizados com nomes de estoque

Você pode criar eventos personalizados com o mesmo nome que eventos de ações, no entanto, não é possível implementar ambos no mesmo controle. Por exemplo, talvez você queira criar um evento personalizado chamado Clique que não é disparado quando o evento de estoque Clique normalmente seria disparado. Então você pode disparar o evento Clique a qualquer momento chamando sua função de disparo.

O procedimento a seguir adiciona um evento de Clique personalizado.

Para adicionar um evento personalizado que usa um nome de evento de estoque

  1. Carregue o projeto do controle.

  2. No Modo de Exibição de Classe, clique com o botão direito do mouse na classe de controle ActiveX para abrir o menu de atalho.

  3. No menu de atalho, clique em Adicionar e em Adicionar Evento.

    Isso abrirá o assistente Adicionar Evento.

  4. Na lista suspensa Nome do Evento, selecione um nome de evento de estoque. Neste exemplo, selecione Click.

  5. Para Tipo de Evento, selecione Personalizado.

  6. Clique em Concluir para criar o evento.

  7. Chame FireClick em locais apropriados em seu código.

Confira também

Controles ActiveX do MFC
Controles ActiveX do MFC: métodos
Classe COleControl