Compartilhar via


Fornece ativação sem janelas

Código de criação da janela (isto é, tudo o que acontece quando você chamar CreateWindow) é caro executar.Um controle que mantém uma tela janela tem gerenciar mensagens para a janela.Controles sem janelas, portanto, são mais rápidas que controles com windows.

Uma vantagem adicional de controles sem janelas é que, ao contrário dos controles em janelas, controles sem janelas suportam pintura transparente e regiões de tela não retangulares.Um exemplo comum de um controle transparente é um controle de texto com fundo transparente.Os controles pinta o texto, mas não o plano de fundo, portanto, tudo o que está sob o texto mostra a.Formulários mais recentes freqüentemente fazem uso de controles não retangulares, como, por exemplo, setas e arredondar botões.

Freqüentemente, um controle não precisa de sua própria janela e, em vez disso, pode usar os serviços da janela de seu contêiner, desde que o recipiente foi escrito para oferecer suporte a objetos sem janelas.Controles sem janelas são compatíveis com recipientes mais antigos.Recipientes mais antigos não gravados para oferecer suporte a controles sem janelas, os controles sem janelas criar uma janela quando ativo.

Porque os controles sem janelas não têm suas próprias janelas, o recipiente (que têm uma janela) é responsável por fornecer serviços que do contrário poderiam ter sido fornecidos pela janela do controle.Por exemplo, se seu controle precisa consultar o foco do teclado, captura 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 apropriado, usando o IOleInPlaceObjectWindowless interface.(Consulte o ActiveX SDK para obter uma descrição desta interface.) COleControl funções de membro chamar esses serviços do recipiente.

Para tornar o seu controle usa ativação sem janelas, incluir o windowlessActivate sinalizador 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 sinalizador é gerado automaticamente se você selecionar o ativação sem janelas opção no Configurações de controle de página do Assistente de controle de ActiveX do MFC.

Quando a ativação sem janelas é ativada, o contêiner delegará a mensagens de entrada para o controle IOleInPlaceObjectWindowless interface.COleControlda implementação dessa interface envia mensagens através do mapa da mensagem do controle, depois de ajustar o mouse coordenadas adequadamente.Você pode processar as mensagens como mensagens de janela normal, adicionando as entradas correspondentes ao mapa da mensagem.Seus manipuladores para essas mensagens, evite usar o m_hWnd variável de membro (ou qualquer função de membro usa) sem verificar primeiro que seu valor não é Nulo.

COleControlfornece funções de membro invocar a captura do mouse, o foco do teclado, rolagem e outros serviços de janela de contêiner conforme apropriado, incluindo:

Controles sem janelas, você sempre deve usar o COleControl funções de membro em vez do correspondente CWnd funções de membro ou as funções de API do Win32 relacionadas.

Você poderá ser o destino de uma operação de arrastar e soltar OLE um controle sem janelas.Normalmente, isso exigiria que a janela do controle ser registrado como um destino de soltar.Desde que o controle não tem nenhuma janela própria, o contêiner usa sua própria janela como um destino de soltar.O controle fornece uma implementação de IDropTarget interface à qual o contêiner pode delegar 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;
}

Consulte também

Conceitos

Controles de ActiveX MFC: otimização