Controles de ActiveX MFC: Adicionando eventos personalizado
Eventos personalizados diferem das ações eventos em que eles não são acionados automaticamente pela classe COleControl.Um evento personalizado reconhece uma determinada ação, determinada pelo desenvolvedor de controle, como um evento.As entradas de mapa de evento para eventos personalizados são representadas pelo EVENT_CUSTOM macro.A seção a seguir implementa um evento personalizado para um projeto de controle de ActiveX que foi criado usando o Assistente de controle de ActiveX.
Adicionando um evento personalizado com o Assistente de evento para adicionar
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 para o nome do evento ClickIn e parâmetros.
Para adicionar o evento personalizado ClickIn usando o Assistente para adicionar evento
Carregar projeto do controle.
No modo de exibição de classe, clique com o botão direito na sua classe de controle de ActiveX para abrir o menu de atalho.
No menu de atalho, clique em Add e clique em Adicionar evento.
Isso abre o Assistente para adicionar eventos.
No nome do evento caixa, primeiro selecione qualquer evento existente e clique no personalizada rádio botão, em seguida, digite ClickIn.
No nome interno , digite o nome da função de acionamento do evento.Para este exemplo, use o valor padrão fornecido pelo Assistente para adicionar evento (FireClickIn).
Adicionar um parâmetro chamado xCoord (tipo OLE_XPOS_PIXELS), usando o O nome do parâmetro e O tipo de parâmetro controles.
Adicionar um segundo parâmetro, chamado yCoord (tipo de OLE_YPOS_PIXELS).
Clique em Concluir para criar o evento.
Adicionar evento Assistente alterações para eventos personalizados
Quando você adiciona um evento personalizado, o Assistente para adicionar eventos faz alterações para a classe de controle.H.CPP, e.Arquivos IDL.Os exemplos de código a seguir são específicos para o evento ClickIn.
As seguintes linhas são adicionadas ao cabeçalho (.H) o arquivo de 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 parâmetros definidos usando o Assistente para adicionar eventos.
Além disso, a seguinte linha é adicionada ao mapa de evento para o controle, localizado na implementação (.Arquivo CPP) de sua classe de controle:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
Esse código mapeia o evento ClickIn para a função embutida FireClickIn, passando os parâmetros definidos usando o Assistente para adicionar eventos.
Finalmente, a seguinte linha ao seu controle.Arquivo IDL:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
Esta linha atribui o evento ClickIn um número específico de identificação, obtido da posição do evento na lista de eventos do Assistente para adicionar eventos.A entrada na lista de eventos permite que um contêiner antecipar o evento.Por exemplo, ele poderá fornecer código manipulador a ser executado quando o evento é acionado.
Chamar FireClickIn
Agora que você adicionou um evento personalizado ClickIn usando o Assistente para adicionar eventos, você deve decidir quando este evento é disparado.Faça isso chamando FireClickIn quando ocorre a ação apropriada.Para esta discussão, o controle usa o InCircle funcionar dentro de um WM_LBUTTONDOWN manipulador de mensagem para acionar o evento ClickIn quando um usuário clica dentro de uma região circular ou elíptica.O procedimento a seguir adiciona o WM_LBUTTONDOWN manipulador.
Para adicionar um manipulador de mensagens com o Assistente para adicionar evento
Carregar projeto do controle.
No modo de exibição de classe, selecione sua classe de controle de ActiveX.
Na janela Propriedades, clique na mensagens botão.
A janela Propriedades exibe uma lista de mensagens que podem ser manipulados pelo controle de ActiveX.Qualquer mensagem mostrada em negrito já tem uma função de manipulador atribuída a ele.
Na janela Propriedades, selecione a mensagem que você deseja manipular.Neste exemplo, selecione WM_LBUTTONDOWN.
Na caixa de lista suspensa à direita, selecione <Add> OnLButtonDown.
Clique duas vezes a nova função de manipulador no modo de exibição de classe para saltar para o código na implementação do manipulador de mensagem (.Arquivo CPP) do seu controle ActiveX.
O seguinte código exemplo chama o InCircle função sempre que o botão esquerdo do mouse é clicado dentro da janela de controle.Este exemplo pode ser encontrado na WM_LBUTTONDOWN função de manipulador, OnLButtonDown, no Circ exemplo abstrata.
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 eventos cria manipuladores de mensagens para ações de botão do mouse, uma chamada para o mesmo manipulador de mensagem da classe base é adicionada automaticamente.Não remova essa chamada.Se o seu controle usa qualquer uma das mensagens ações do mouse, os manipuladores de mensagem na classe base devem ser chamados para garantir a captura do mouse é 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 atingir esse comportamento, você pode colocar o 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 de InCircle função para o cabeçalho do controle (.H) arquivo:
VARIANT_BOOL InCircle(CPoint& point);
Eventos personalizados com nomes de ações
Você pode criar eventos personalizados com o mesmo nome como eventos de ações, no entanto, você não pode implementar ambos no mesmo controle.Por exemplo, convém criar um evento personalizado chamado clique não dispara quando o evento ações clique normalmente seria acionado.Você então poderia acionar o evento Click a qualquer momento chamando a função de acionamento.
O procedimento a seguir adiciona um clique personalizado evento.
Para adicionar um evento personalizado que usa um nome de evento de ações
Carregar projeto do controle.
No modo de exibição de classe, clique com o botão direito na sua classe de controle de ActiveX para abrir o menu de atalho.
No menu de atalho, clique em Add e clique em Adicionar evento.
Isso abre o Assistente para adicionar eventos.
No Nome do evento lista suspensa, selecione um nome de evento de ações.Neste exemplo, selecione clique em.
Para Tipo de evento, selecione personalizada.
Clique em Concluir para criar o evento.
Chamar FireClick em locais apropriados no seu código.