Compartilhar via


Fornecendo ativação sem janelas

O código de criação da janela (ou seja, tudo o que acontece quando você chama CreateWindow) é caro executar. Um controle que mantém uma janela na tela precisa gerenciar mensagens para a janela. Os controles sem o windows são como consequência mais rápido do que controla com o windows.

Uma vantagem adicional de controles sem o windows é que, ao contrário dos controles da janela do, os controles sem windows da suporte à paint transparente e regiões nonrectangular da tela. Um exemplo comum de um controle transparente é um controle de texto com um plano de fundo transparente. Os controles pintam o texto mas não o plano de fundo, assim o que está sob mostra de texto completo. Mais recentes formulários usam frequentemente controles nonrectangular, como setas os botões e arredonda.

Frequentemente, um controle não precisa de uma janela de seus próprios e, em vez disso, não pode usar os serviços da janela do respectivo contêiner, contanto que o contêiner foi registrado dar suporte a objetos sem o windows. Os controles sem o windows são compatíveis com contêineres mais antigos. Em contêineres mais antigas não escritos para oferecer suporte aos controles do windows, sem os controles sem windows cria uma janela quando ativas.

Como os controles sem o windows não têm suas próprias o windows, o contêiner (que tem uma janela) é responsável para fornecer os serviços que são fornecidos de outra forma por própria janela do controle. Por exemplo, se suas necessidades de controle do foco de teclado, a captura do mouse, ou obter um contexto do dispositivo, essas operações são gerenciadas pelo contêiner. O contêiner roteia as mensagens de entrada de usuário enviadas à janela ao controle do windows sem apropriado, usando a interface de IOleInPlaceObjectWindowless . (Consulte ActiveX SDK para obter uma descrição desta interface.) funções de membro de COleControl para invocar esses serviços do contêiner.

Para fazer seu controle usar a ativação sem o windows, inclua o sinalizador de windowlessActivate no conjunto de sinalizadores retornados 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 sinalizador é gerado automaticamente se você selecionar a opção de Windowless activation na página de Controle configurações do assistente do controle ActiveX MFC.

Quando a ativação sem o windows está habilitada, o contêiner delegará para as mensagens para a interface de IOleInPlaceObjectWindowless do controle. a implementação deCOleControl dessa interface despacha as mensagens pelo mapa da mensagem do seu controle, depois de definir as coordenadas do mouse em adequadamente. Você pode processar as mensagens como mensagens comuns da janela, adicionando entradas correspondentes no mapa da mensagem. Nos manipuladores para essas mensagens, evite usar a variável de membro de m_hWnd (ou qualquer função de membro que o usar) sem verificar primeiro se o valor não é nulo.

COleControl fornece funções de membro que invocam a captura do mouse em, o foco de teclado, o deslocamento, e outros serviços da janela do contêiner conforme apropriado, incluindo:

Em controles sem o windows, você sempre deve usar as funções de membro de COleControl em vez de funções de membro correspondente de CWnd ou suas funções relacionadas da API do Win32.

Talvez você queira um controle sem o windows para ser o destino de uma operação de arrastar e soltar OLE. Normalmente, isso exigiria que a janela de controle foi registrada como um destino de descarte. Desde que o controle não tem nenhuma janela de seus próprios, o contêiner usa sua própria janela como um destino de descarte. O controle fornece uma implementação da interface de IDropTarget ao qual o contêiner pode delegar chamadas por um tempo apropriado. Para expor essa interface para o contêiner, substitua COleControl::GetWindowlessDropTarget. Por exemplo:

IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
   m_DropTarget.m_xDropTarget.AddRef();
   return &m_DropTarget.m_xDropTarget;
}

Consulte também

Conceitos

Controles ActiveX MFC: otimização