Controles de ActiveX MFC: Subclassificação um controle do Windows
Este artigo descreve o processo para subclassificação um controle comum do Windows para criar um controle de ActiveX.Controle subclassificação existente do Windows é uma maneira rápida de desenvolver um controle ActiveX.O novo controle terá a capacidade de controle subclasse do Windows, como pintura e responder a cliques de mouse.ActiveX MFC controles exemplo botão é um exemplo de subclassificação um controle do Windows.
Para subclassificar um controle do Windows, conclua as seguintes tarefas:
Substituir as funções de membro IsSubclassedControl e PreCreateWindow de COleControl
Modificar a função de membro OnDraw
Lidar com quaisquer mensagens de controle de ActiveX (OCM) refletidas no controle
Observação Muito desse trabalho é feito para você pelo Assistente de controle de ActiveX se você selecionar o controle para ser uma subclasse usando o Selecionar classe de janela pai lista suspensa a Configurações de controle de página.
Consulte o artigo Q243454 do Knowledge Base para obter mais informações sobre subclassificação um controle.
Substituindo IsSubclassedControl e PreCreateWindow
Para substituir PreCreateWindow e IsSubclassedControl, adicione as seguintes linhas de código para o protected seção de declaração de classe de controle:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
No arquivo de implementação de controle (.CPP), adicione as seguintes linhas de código para implementar as duas funções substituídas:
// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx
BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("BUTTON");
return COleControl::PreCreateWindow(cs);
}
// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control
BOOL CMyAxSubCtrl::IsSubclassedControl()
{
return TRUE;
}
Observe que, neste exemplo, os Windows controle de botão é especificado em PreCreateWindow.No entanto, quaisquer controles padrão do Windows pode ter subclasses.Para obter mais informações sobre controles padrão do Windows, consulte controles de.
Quando subclassificação um controle do Windows, você poderá especificar o estilo de janela específico (WS_) ou o estilo de janela estendido (WS_EX_) sinalizadores para ser usado na criação de janela do controle.Você pode definir valores para esses parâmetros na PreCreateWindow função de membro modificando o cs.style e o cs.dwExStyle campos de estrutura.Modificações para esses campos devem ser feitas usando um OR operação, para preservar os sinalizadores padrão definidos pela classe COleControl.Por exemplo, se o controle é Subclassificação do controle de botão e você deseja que o controle seja exibido como uma caixa de seleção, insira a seguinte linha de código na implementação de CSampleCtrl::PreCreateWindow, antes da instrução return:
cs.style |= BS_CHECKBOX;
Esta operação adiciona o BS_CHECKBOX estilo sinalizador, deixando o sinalizador de estilo padrão (estilo) da classe COleControl intactos.
Modificando a função de membro OnDraw
Se desejar que seu controle subclasse para manter a mesma aparência que o controle do Windows correspondente, o OnDraw função de membro para o controle deve conter apenas uma chamada para o DoSuperclassPaint função de membro, como no exemplo a seguir:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
O DoSuperclassPaint função de membro, implementada pelo COleControl, usa o procedimento de janela de controle do Windows para desenhar o controle no contexto de dispositivo especificado dentro do retângulo delimitador.Isso torna o controle visível mesmo quando não está ativo.
Observação |
---|
O DoSuperclassPaint função de membro só funcionará com esses tipos de controle que permitem um contexto de dispositivo a ser passado como o wParam de um WM_PAINT mensagem.Isso inclui alguns dos controles padrão do Windows, como SCROLLBAR e botãoe todos os controles comuns.Para controles que não oferecem suporte a esse comportamento, você precisará fornecer seu próprio código para exibir um controle inativo corretamente. |
Manipulação refletido mensagens de janela
Controles do Windows normalmente enviam determinadas mensagens de janela para sua janela pai.Algumas dessas mensagens, como WM_COMMAND, fornecer uma notificação de uma ação do usuário.Outros, como WM_CTLCOLOR, usado para obter informações a partir da janela pai.Um controle ActiveX geralmente se comunica com a janela pai por outros meios.As notificações são comunicadas por disparo de eventos (enviar notificações de eventos) e informações sobre o recipiente de controle são obtidas acessando as propriedades ambiente do contêiner.Porque existem essas técnicas de comunicação, recipientes de controle de ActiveX não deve processar as mensagens de janela enviadas pelo controle.
Para impedir que o recipiente recebendo as mensagens de janela enviadas por um controle Windows subclasse, COleControl cria uma janela extra para servir como pai do controle.Esta janela extra, chamada "refletor", é criada somente para um controle de ActiveX que as subclasses de um Windows controlam e tem o mesmo tamanho e posição da janela de controle.A janela refletor intercepta determinadas mensagens de janela e as envia para o controle.O controle em seu procedimento de janela pode processar essas mensagens refletidas tomando medidas apropriadas para um controle de ActiveX (por exemplo, um evento de acionamento).Consulte Refletido identificações de mensagem de janela para obter uma lista do windows interceptados mensagens e seus correspondente refletem mensagens.
Um contêiner de controle de ActiveX pode ser projetado para executar reflexão de mensagem, eliminando a necessidade de COleControl para criar a janela refletor e reduzindo o tempo de execução sobrecarga para um subclasse controle do Windows.COleControldetecta se contêiner oferece suporte a esse recurso Verificando uma propriedade de ambiente MessageReflect com um valor de TRUE.
Para manipular uma mensagem da janela refletido, adicionar uma entrada ao mapa da mensagem de controle e implementar uma função de manipulador.Como mensagens refletidas não fazem parte do conjunto padrão de mensagens definidas pelo Windows, o modo de exibição de classe não oferece suporte adicionando esses manipuladores de mensagem.No entanto, não é difícil adicionar um manipulador manualmente.
Para adicionar um manipulador de mensagem para uma mensagem da janela refletido manualmente faça o seguinte:
Na classe de controle.Arquivo H, declare uma função de manipulador.A função deve ter um tipo de retorno de LRESULT e dois parâmetros com tipos WPARAM e LPARAM, respectivamente.Por exemplo:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
Na classe de controle.CPP arquivo, adicionar um ON_MESSAGE entrada de mapa da mensagem.Os parâmetros desta entrada devem ser o identificador de mensagem e o nome da função de manipulador.Por exemplo:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Também na.Arquivo CPP, implementar a OnOcmCommand função de membro para processar a mensagem refletida.O wParam e lParam parâmetros são os mesmos da mensagem em janela original.
Para um exemplo de como reflete as mensagens são processadas, consulte exemplos de controles MFC ActiveX botão.Ele demonstra uma OnOcmCommand manipulador detecta o BN_CLICKED código de notificação e responde por acionamento (Enviar) um evento de clique.