Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os eventos personalizados diferem dos eventos de estoque, pois eles não são disparados automaticamente por classe COleControl. Um evento personalizado reconhece uma determinada 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 que foi criado usando o Assistente de Controle ActiveX.
Adicionando 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 de Adição de Evento
Carregue o projeto do controle.
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.
No menu de atalho, clique em Adicionar e clique em Adicionar Evento.
Isso abre o Assistente para Adicionar Evento.
Na caixa Nome do Evento, primeiro selecione qualquer evento existente, depois clique no botão de opção Personalizado e digite ClickIn.
Na caixa Nome interno, digite o nome da função que dispara o evento. Para este exemplo, use o valor padrão fornecido pelo Assistente para Adicionar Evento (
FireClickIn).Adicione um parâmetro, chamado xCoord (tipo OLE_XPOS_PIXELS), usando os controles Nome do Parâmetro e Tipo de Parâmetro .
Adicione um segundo parâmetro, chamado yCoord (tipo OLE_YPOS_PIXELS).
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 nos arquivos da classe de controle .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 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 FireClickIn que chama COleControl::FireEvent com o evento ClickIn e os parâmetros definidos usando o Assistente para Adicionar Evento.
Além disso, a linha a seguir é adicionada ao mapa de eventos para o controle, localizado na implementação (arquivo .CPP) da classe do 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 que você definiu usando o Assistente de Adição de Evento.
Por fim, a linha a seguir é adicionada ao arquivo .IDL do seu 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 do Assistente de Adição de Eventos. A entrada na lista de eventos permite que um contêiner antecipe o evento. Por exemplo, ele pode fornecer o código do 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 deve ser acionado. Você faz isso chamando FireClickIn quando a ação apropriada ocorre. Para essa 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 procedimento a seguir adiciona o manipulador WM_LBUTTONDOWN.
Para adicionar um manipulador de mensagens com o Assistente para Adicionar Evento
Carregue o projeto do controle.
No Modo de Exibição de Classe, selecione sua classe de controle ActiveX.
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.
Selecione a mensagem que você deseja manipular. Para este exemplo, selecione
WM_LBUTTONDOWN.Na caixa de listagem suspensa à direita, selecione <Adicionar> OnLButtonDown.
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 InCircle função sempre que o botão esquerdo do mouse é clicado dentro da 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 padrão do mouse, os manipuladores de mensagens na classe base deverão ser chamados para garantir que a captura do mouse seja devidamente gerenciada.
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 esse comportamento, você pode colocar a InCircle função na implementação do controle (. Arquivo 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 arquivo de cabeçalho (.H) do controle:
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, 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 Click personalizado.
Para adicionar um evento personalizado que usa um nome de evento padrão
Carregue o projeto do controle.
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.
No menu de atalho, clique em Adicionar e clique em Adicionar Evento.
Isso abre o Assistente para Adicionar Evento.
Na lista suspensa Nome do Evento, selecione um nome de evento de estoque. Para este exemplo, selecione Clique.
Para Tipo de Evento, selecione Personalizado.
Clique em Concluir para criar o evento.
Chame
FireClickem locais apropriados em seu código.
Consulte também
Controles MFC ActiveX
Controles ActiveX do MFC: métodos
Classe COleControl