Os controles ActiveX MFC: Subclassificação de um controle do Windows
Este artigo descreve o processo de subclassificação um controle ActiveX comum do Windows para criar um controle ActiveX.Subclassificação um existente do Windows controle é uma maneira rápida para desenvolver um controle ActiveX.O novo controle terá a capacidade do controle "subclasse" do Windows, sistema autônomo pintura e responder a cliques de mouse.Controla o MFC ActiveX de amostra BOTÃO é um exemplo de subclassificação um controle do Windows.
A subclasse um controle do Windows, conclua as tarefas seguintes:
Substituir as funções de membro IsSubclassedControl e PreCreateWindow de COleControl
Modificar a função de membro OnDraw
Lidar com quaisquer mensagens de controle ActiveX (OCM) refletidas no controle
Observação: Muito desse trabalho é concluído para você pelo Assistente de controle ActiveX se você selecionar o controle para ser uma subclasse usando o Selecionar classe de janela pai na lista suspensa no Configurações de controle página.
Consulte o artigo do base de dados de conhecimento Q243454 para obter mais informações sobre um controle de subclassificação.
Substituindo IsSubclassedControl e PreCreateWindow
Para substituir PreCreateWindow e IsSubclassedControl, adicione as seguintes linhas de código para o protected seção de declaração da classe de controle:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
No arquivo de implementação do 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, o controle de botão do Windows está especificado em PreCreateWindow. Uma no entanto, quaisquer controles padrão do Windows pode ser subclasse.Para obter mais informações sobre controles padrão do Windows, consulte Controles.
Quando subclassificação um controle do Windows, você poderá especificar o estilo de janela específico (WS_) ou estilo de janela ( estendidoWS_EX_) sinalizadores a serem usadas na criação da janela do controle.Você pode conjunto os valores desses parâmetros no PreCreateWindow função de membro, modificando o CS.estilo and the CS.dwExStyle campos de estrutura.Modificações para esses campos devem ser feitas usando um OR operação, para preservar os sinalizadores padrão definidas pela classe COleControl. Por exemplo, se o controle estiver dispondo em subclasse controle de botão e você desejar que o controle seja exibido sistema autônomo uma caixa de seleção, insira a seguinte linha de código na implementação de CSampleCtrl::PreCreateWindow, antes da demonstrativo de retorno:
cs.style |= BS_CHECKBOX;
Esta operação adiciona o BS_CHECKBOX estilo sinalizar, deixando o sinalizar de estilo padrão (WS_CHILD) de classe COleControl intactos.
Modificar a função de membro OnDraw
Se você desejar que o controle "subclasse" para manter a mesma aparência que o controle do Windows correspondente, a OnDraw função de membro para o controle deve conter apenas uma telefonar para o DoSuperclassPaint função de membro, sistema autônomo no exemplo a seguir:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
The DoSuperclassPaint função de membro, implementada por COleControl, utiliza 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 estiver ativo.
Observação: |
---|
O DoSuperclassPaint função de membro funcionará somente com esses tipos de controle que permitem um contexto de dispositivo a ser passado sistema autônomo o wParam of a WM_PAINT mensagem. Isso inclui alguns dos controles padrão do Windows, sistema autônomo BARRA DE ROLAGEM and BOTÃO e todos sistema autônomo controles comuns.Para controles que não oferecem suporte a esse comportamento, você terá que fornecer seu próprio código para exibir corretamente um controle inativo. |
Tratamento refletido mensagens de janela
Controles do Windows normalmente enviam certas mensagens de janela para sua janela pai.Algumas dessas mensagens, sistema autônomo WM_COMMAND, fornecer uma notificação de uma ação do usuário.Outras, sistema autônomo WM_CTLCOLOR, são usados 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 acionamento de eventos (enviar notificações de eventos) e as informações sobre o recipiente de controle são obtidas acessando propriedades do ambiente do contêiner.Como essas técnicas de comunicação existirem, recipientes de controle ActiveX não deverão processo as mensagens de janela enviadas pelo controle.
Para impedir que o contêiner receba sistema autônomo mensagens de janela, por um controle do Windows em que foi feito subclassing, COleControl cria uma janela adicional para servir sistema autônomo pai do controle. Essa janela extra, chamada "refletor", é criada somente para controles ActiveX de nesse subclsistema autônomoses um controle do Windows e h sistema autônomo mesmo dimensionar e posicionar sistema autônomo a janela de controle.A janela de refletor intercepta determinadas mensagens de janela e as envia para o controle.O controle, em seu procedimento de janela, em seguida, pode processo refletirá as mensagens por tomar medidas apropriadas para um controle ActiveX (por exemplo, um evento de acionamento).See Refletem identificações de mensagem de janela para obter uma lista de mensagens de janelas interceptado e seus correspondente reflete as mensagens.
Um contêiner de controle ActiveX pode ser projetado para executar a reflexão de mensagem propriamente dita, eliminando a necessidade de COleControl Para criar a janela do refletor e reduzindo o time de execução sobrecarga para "subclasse" um controle do Windows. COleControl detecta se o contêiner oferece suporte a esse recurso Verificando uma propriedade de ambiente MessageReflect com um valor de TRUE.
Para lidar com uma mensagem em janela refletido, adicione uma entrada para o MAP da mensagem de controle e implementar uma função de manipulador.Como refletidas mensagens não são parte do conjunto padrão de mensagens definidas pelo Windows, classe View não suporta a adição de tais manipuladores de mensagens.No entanto, não é difícil adicionar um manipulador manualmente.
Para adicionar um manipulador de mensagens para uma mensagem de janela refletido manualmente faça o seguinte:
No arquivo .h de classe de controle, declare uma função de manipulador.A função deve ter um tipo de retorno de LRESULT e dois parâmetros, com tipos de WPARAM and LPARAM, respectivamente.Por exemplo:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
No arquivo .CPP classe de controle, adicione um ON_MESSAGE entrada para o MAP da mensagem. Os parâmetros desta entrada devem ser o identificador da 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 no arquivo .CPP, implementar o OnOcmCommandfunção de membro para processar a mensagem refletida.The wParam and lParam parâmetros são sistema autônomo mesmos que aquelas da mensagem em janela original.
Para obter um exemplo de como refletidas mensagens são processadas, consulte o MFC ActiveX controles amostra BOTÃO.Ele demonstra um OnOcmCommand manipulador que detecta o BN_CLICKED código de notificação e responde por acionamento (Enviar) um evento clicar.