Controles ActiveX MFC: adicionando eventos personalizados
Eventos personalizados são diferentes dos eventos de estoque que não são acionados automaticamente pela classe COleControl. Um evento personalizado reconhece qualquer ação, determinada pelo desenvolvedor de controle, como um evento. As entradas do mapa do evento de eventos personalizados são representadas pela macro de EVENT_CUSTOM . A seção a seguir implementa um evento personalizado para um projeto do controle ActiveX que é criado usando o assistente de controle ActiveX.
Adicionando um evento personalizado com o assistente de evento adicionar
O procedimento a seguir adiciona um evento personalizado específico, ClickIn. Você pode usar este procedimento para adicionar outros eventos personalizados. Substituir o nome de evento personalizado e seus parâmetros para o nome e os parâmetros do evento de ClickIn.
Para adicionar o evento personalizado de ClickIn usando o assistente de evento adicionar
Carregar o projeto do controle.
Na exibição da classe, clique com o botão direito do mouse na sua classe do controle ActiveX para abrir o menu de atalho.
No menu de atalho, clique Adicionar e clique em Adicionar Evento.
Isso abre o assistente de evento a ser adicionado.
Na caixa de Nome do Evento , primeiro selecione qualquer evento existente, clique no botão de opção de Personalizar , o tipo ClickIn.
Na caixa de Nome interno , digite o nome da função do acionamento do evento. Para esse exemplo, use o valor padrão fornecido pelo assistente de evento adicionarFireClickIn().
Adicionar um parâmetro, xCoord chamado (tipo OLE_XPOS_PIXELS), usando os controles de Nome do parâmetro e de Tipo de parâmetro .
Adicionar um segundo parâmetro, yCoord chamado (tipo OLE_YPOS_PIXELS).
Clique em Concluir para criar o evento.
Adicionar alterações do assistente do evento de eventos personalizados
Quando você adiciona um evento personalizado, o assistente de evento adicionar fizer alterações no controle classificar. Arquivos de H, de .CPP, e de .IDL. Os exemplos de código são específicas ao evento de ClickIn.
As seguintes são adicionadas linhas ao cabeçalho (. H) arquivo 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 a seguir declara uma função embutida chamada FireClickIn que chama COleControl::FireEvent ao evento e os parâmetros de ClickIn você definiu usando o assistente de evento a ser adicionado.
Além disso, a seguinte linha é adicionada ao mapa de eventos do controle, localizado no arquivo de implementação) (.CPP da sua classe de controle:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
Esse código mapeia o evento ClickIn à função embutida FireClickIn, passando os parâmetros definidos usando o assistente de evento a ser adicionado.
Finalmente, a seguinte linha é adicionada ao arquivo de .IDL do controle:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
Essa linha atribui ao evento de ClickIn um o número de identificação específico, feito na posição do evento na lista de evento do assistente de evento a ser adicionado. A entrada na lista de eventos permite que um contêiner antecipe o evento. Por exemplo, pode fornecer o código do manipulador a ser executado quando o evento é disparado.
Chamada FireClickIn
Agora que você adicionou o evento personalizado de ClickIn usando o assistente de evento adicionar, você deve decidir quando esse evento deve ser acionado. Isso é feito chamando FireClickIn quando a ação apropriada ocorre. Para esta discussão, o controle usa a função de InCircle dentro de um manipulador de mensagens de WM_LBUTTONDOWN para acionar o evento de ClickIn quando um usuário clica em uma região circular ou elítica. O procedimento a seguir adiciona o manipulador de WM_LBUTTONDOWN .
Para adicionar um manipulador de mensagens com o assistente de evento adicionar
Carregar o projeto do controle.
Na exibição da classe, marque sua classe do controle ActiveX.
Na janela Propriedades, clique no botão de Mensagens .
A janela Propriedades exibe uma lista de mensagens que podem ser manipuladas pelo controle ActiveX. Qualquer mensagem mostrada em negrito já tiver uma função de manipulador atribuída a ele.
Na janela Propriedades, selecione a mensagem que você deseja controlar. Neste exemplo, selecione WM_LBUTTONDOWN.
Na caixa de listagem suspensa à direita, selecione <Add> OnLButtonDown.
Clique duas vezes na nova função de manipulador na exibição da classe para saltar para o código do manipulador de mensagens no arquivo de implementação (.CPP) do controle ActiveX.
O exemplo de código a seguir chama a função de InCircle cada vez que o botão esquerdo do mouse é clicado na janela de controle. Este exemplo pode ser localizado na função do manipulador de WM_LBUTTONDOWN , OnLButtonDown, o sumário de Exemplo de Circ .
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
Dica
Quando o assistente de evento adicionar cria manipuladores de mensagem para ações no botão do mouse em, uma chamada ao mesmo manipulador de mensagens da classe base é adicionado automaticamente.Não remova essa chamada.Se o controle usa algumas das mensagens de estoque do mouse em, os manipuladores de mensagem na classe base deve ser chamado para assegurar que a captura do mouse em seja tratado adequadamente.
No exemplo a seguir, o evento é acionado somente quando clique nele ocorrer dentro de uma região circular ou elítica no controle. Para obter esse comportamento, você pode colocar a função de InCircle no arquivo de implementação do controle .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 de InCircle ao cabeçalho do controle (. H) arquivo:
VARIANT_BOOL InCircle(CPoint& point);
Eventos personalizados com nomes de estoque
Você pode criar eventos personalizados com o mesmo nome que os eventos de estoque no entanto, você não pode implementar o no mesmo controle. Por exemplo, convém criar um evento personalizado chamado clique em que não é acionado quando clique em de estoque de evento normalmente acionaria. Depois você pode acionar o evento na qualquer momento chamando a função de acionamento.
O procedimento a seguir adiciona um evento personalizado clique em.
Para adicionar um evento personalizado que usa um nome de estoque de evento
Carregar o projeto do controle.
Na exibição da classe, clique com o botão direito do mouse na sua classe do controle ActiveX para abrir o menu de atalho.
No menu de atalho, clique Adicionar e clique em Adicionar Evento.
Isso abre o assistente de evento a ser adicionado.
Na lista suspensa de Nome do Evento , selecione um nome de estoque do evento. Para este exemplo, Clicarselecione.
Para Tipo de Evento, Personalizarselecione.
Clique em Concluir para criar o evento.
Chame FireClick em locais apropriados em seu código.