Fornecendo ativação sem janela
Código de criação da janela (ou seja, tudo o que acontece quando você chamar CreateWindow) é dispendioso executar.Um controle que mantém uma tela janela tem que gerenciar mensagens da janela.Controles sem janelas, portanto, são mais rápidas que controles com janelas.
Uma vantagem adicional de controles sem janelas é que, diferentemente em janelas controles, controles sem janelas compatível pintura transparente e regiões de tela não retangular.Um exemplo comum de um controle transparente é um controle de texto com um plano de fundo transparente.Os controles pinta o texto, mas não no plano de fundo, para que tudo o que está sob o texto aparece.Formulários mais recentes geralmente fazem uso de controles não-retangulares, tais sistema autônomo setas e arredondar botões.
Freqüentemente, um controle não é necessário que sua própria janela e, em vez disso, pode usar os serviços de janela de seu contêiner, desde que o contêiner foi escrito para suporte a objetos sem janelas.Controles sem janelas são compatível com versões anteriores com contêineres mais antigos.Em contêineres mais antigos não escritas para dar suporte a controles sem janelas, os controles sem janelas criar uma janela quando ativo.
Como controles sem janelas não possuem suas próprias janelas, o contêiner (que tem uma janela) é responsável por fornecer serviços que do contrário poderiam ter sido fornecidos pela janela do controle.Por exemplo, se o seu controle precisar consultar o foco do teclado, capturar o mouse ou obter um contexto de dispositivo, essas operações são gerenciadas pelo contêiner.O contêiner roteia mensagens de entrada do usuário enviadas para sua janela para o controle sem janelas apropriada, usando o IOleInPlaceObjectWindowless interface. (Consulte o SDK do ActiveX para obter uma descrição desta interface.) COleControl funções de membro chamar esses serviços do contêiner.
Para usar ativação sem janelas, inclua o seu controlewindowlessActivate sinalizar no conjunto de sinalizadores retornado por COleControl::GetControlFlags.Por exemplo:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
...
return dwFlags;
}
O código para incluir esse sinalizar é gerado automaticamente se você selecionar o Ativação sem janelas opção a Configurações de controle ActiveX página do assistente MFC controle ActiveX.
Quando a ativação sem janelas está ativada, o contêiner delegará a mensagens de entrada IOleInPlaceObjectWindowless interface. COleControlda implementação dessa interface envia as mensagens pelo MAP da mensagem do controle, depois de ajustar o mouse coordena apropriadamente. Você pode processar as mensagens como mensagens de janela normal, adicionando as entradas correspondentes ao MAP da mensagem.Nos seus manipuladores para essas mensagens, evite usar o m_hWnd variável de membro (ou qualquer função de membro que o utiliza) sem primeiro verificar que seu valor não é NULO.
COleControl fornece funções de membro que invocam capturar do mouse, o foco do teclado, de rolagem e outros serviços de janela do contêiner conforme apropriado, incluindo:
Em controles sem janelas, você sempre deve usar o COleControl funções de membro em vez do correspondente CWnd funções de membro ou suas funções da API do Win32 relacionadas.
Talvez seja necessário um controle sem janelas para ser o destino de uma operação de do tipo arrastar e soltar OLE.Normalmente, isso exigiria que a janela do controle ser registrado sistema autônomo um destino de soltar.sistema autônomo o controle não tem nenhuma janela de si próprio, o contêiner usa sua própria janela sistema autônomo um destino de soltar.O controle fornece uma implementação do IDropTarget interface à qual o contêiner pode delegado chamadas no momento adequado. Para expor essa interface para o contêiner, substituir COleControl::GetWindowlessDropTarget.Por exemplo:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}