Partilhar via


Controles ActiveX MFC: Adicionando eventos personalizados

Os eventos personalizados diferem dos eventos de estoque porque não são disparados automaticamente pela classe COleControl. Um evento personalizado reconhece uma determinada ação, determinada pelo desenvolvedor do 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 que foi criado usando o Assistente de controle ActiveX.

A Adicionar um Evento Personalizado com o Assistente de Adicionar Evento

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

Para adicionar o evento personalizado ClickIn usando o Assistente para Adição de Evento

  1. Carregue o projeto do seu controlador.

  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 seguida, clique em Adicionar evento.

    Isso abre o Assistente para Adicionar Evento.

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

  5. Na caixa Nome interno, digite o nome da função que desencadeia o 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 Parameter Name e Parameter Type .

  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 adiciona um evento personalizado, o Assistente de Adição de Evento faz alterações nos ficheiros da classe de controlo .H, .CPP e .IDL. Os exemplos de código a seguir são específicos para o evento ClickIn.

As seguintes linhas são adicionadas ao arquivo de cabeçalho (.H) da sua classe de controlo:

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

Este código declara uma função embutida chamada FireClickIn, que chama COleControl::FireEvent com o evento ClickIn e os parâmetros que definiu usando o Assistente para Adicionar Evento.

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

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

Este código mapeia o evento ClickIn para a função FireClickIn embutida, passando os parâmetros que definiu usando o Assistente de Adição de Eventos.

Finalmente, a seguinte linha é adicionada ao ficheiro IDL do seu controlo:

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

Esta linha atribui ao evento ClickIn um número de ID específico, retirado da posição do evento na lista de eventos Add Event Wizard. 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, você deve decidir quando esse evento será acionado. Você faz isso chamando FireClickIn quando a ação apropriada ocorre. Para esta discussão, o controle usa a InCircle função dentro de um WM_LBUTTONDOWN manipulador de mensagens para disparar o evento ClickIn quando um usuário clica dentro de uma região circular ou elíptica. O seguinte procedimento adiciona o manipulador WM_LBUTTONDOWN.

Para adicionar um manipulador de mensagens com o Assistente de Adição de Evento

  1. Carregue o projeto do seu controlador.

  2. Em 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 a ela.

  4. Selecione a mensagem que deseja manipular. Para este exemplo, selecione WM_LBUTTONDOWN.

  5. No menu suspenso à direita, selecione <Adicionar> OnLButtonDown.

  6. Dê um duplo clique na nova função do manipulador no Modo de Exibição de Classe para aceder ao código do manipulador de mensagens no ficheiro de implementação (.CPP) do seu controlo ActiveX.

O exemplo de código a seguir chama a InCircle função toda vez que o botão esquerdo do mouse é clicado dentro da janela de controle. Este exemplo pode ser encontrado na WM_LBUTTONDOWN função de tratamento, OnLButtonDown, no resumo do 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 esta chamada. Se o seu controlo utilizar alguma das mensagens de rato pré-definidas, os gestores de mensagens na classe base devem ser chamados para assegurar que a captura do rato seja feita 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 obter este comportamento, podes colocar a função InCircle no ficheiro de implementação do teu controlo (.CPP):

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 ficheiro de cabeçalho do seu controlo (.H):

VARIANT_BOOL InCircle(CPoint& point);

Eventos personalizados com nomes de estoque

Você pode criar eventos personalizados com o mesmo nome que eventos de estoque, no entanto, você não pode implementar ambos no mesmo controle. Por exemplo, talvez você queira criar um evento personalizado chamado Click que não é acionado quando o evento de estoque Click normalmente é acionado. Em seguida, você pode disparar o evento Click a qualquer momento chamando sua função de disparo.

O procedimento a seguir adiciona um evento de clique personalizado.

Para adicionar um evento personalizado utilizando um nome de evento padrão

  1. Carregue o projeto do seu controlador.

  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 seguida, clique em Adicionar evento.

    Isso abre o Assistente para Adicionar Evento.

  4. Na lista suspensa Nome do evento, selecione um nome de evento padrão. Para este exemplo, selecione Clicar.

  5. Em Tipo de evento, selecione Personalizado.

  6. Clique em Concluir para criar o evento.

  7. Chame FireClick nos locais apropriados no seu código.

Ver também

Controles ActiveX MFC
Controles ActiveX MFC: Métodos
Classe COleControl