Fourniture de lancement sans fenêtre
Le code de création de fenêtre (autrement dit, tout ce qui se produit lorsque vous appelez CreateWindow) est cher à exécuter.Un contrôle qui gère une fenêtre affichée à l'écran doit gérer les messages de la fenêtre.Les contrôles sans fenêtre sont donc plus rapides que les contrôles avec windows.
Un autre avantage des contrôles sans fenêtre est que, contrairement aux contrôles fenêtrés, les contrôles sans fenêtre prennent en charge la peinture transparente et des zones nonrectangular d'écran.Un exemple courant d'un contrôle transparent est un contrôle de texte avec un arrière-plan transparent.Les contrôles peint le texte mais pas l'arrière-plan, donc toute sous les éléments de texte.De nouveaux formulaires utilisent souvent des contrôles nonrectangular, tels que les flèches les boutons et arrondis.
Souvent, un contrôle n'a pas besoin d'une fenêtre de son propre et, à la place, ne pouvez pas utiliser les services de fenêtre de son conteneur, à condition que le conteneur a été écrit pour prendre en charge les objets sans fenêtre.Les contrôles sans fenêtre sont de compatibilités descendante avec les conteneurs plus anciens.Dans les conteneurs plus anciens écrits pour prendre en charge des contrôles sans fenêtre, les contrôles sans fenêtre créent une fenêtre si actifs.
Étant donné que les contrôles sans fenêtre n'ont pas leurs propres fenêtres, le conteneur (qui possède une fenêtre) permet de fournir des services qui sinon auraient été fournis par la propre fenêtre du contrôle.Par exemple, si votre contrôle pour interroger le focus clavier, de capturer la souris, ou d'obtenir un contexte de périphérique, ces opérations sont gérés par le conteneur.Le conteneur itinéraire de messages d'entrée d'utilisateur envoyés à sa fenêtre au contrôle sans fenêtre approprié, à l'aide de l'interface d' IOleInPlaceObjectWindowless .(Consultez ActiveX Kit de développement logiciel pour obtenir une description de cette interface.) les fonctions membres d' COleControl appeler ces services du conteneur.
Pour donner à l'utilisation du contrôle l'activation sans fenêtre, incluez l'indicateur de windowlessActivate dans le jeu de balises retournées par COleControl::GetControlFlags.Par exemple :
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
...
return dwFlags;
}
Le code pour inclure cette balise est généré automatiquement si vous sélectionnez l'option de Windowless activation dans la page de paramètres de contrôle de l'Assistant Contrôle ActiveX MFC.
Lorsque l'activation sans fenêtre est activée, le conteneur délèguera des messages d'entrée à l'interface d' IOleInPlaceObjectWindowless du contrôle.l'implémentation des COleControl de cette interface contient les messages par le biais de la table des messages de votre contrôle, après avoir ajusté les coordonnées de la souris correctement.Vous pouvez traiter les messages comme les messages ordinaires de fenêtre, en ajoutant les entrées correspondantes dans la table des messages.Dans vos gestionnaires pour ces messages, évitez d'utiliser la variable membre d' m_hWnd (ou une fonction membre qui l'utilise) sans vous permettre d'abord que sa valeur n'est pas NULL.
COleControl fournit les fonctions membres qui appellent la capture de la souris, le focus clavier, le défilement, et d'autres services de fenêtre du conteneur comme approprié, notamment :
Dans les contrôles sans fenêtre, vous devez toujours utiliser des fonctions membres d' COleControl à la place des fonctions membres correspondantes d' CWnd ou leur API Win32 relatif s'exécute.
Vous pouvez souhaiter qu'un contrôle sans fenêtre pour être la cible d'une opération de glisser-déplacer OLE.Normalement, cela nécessite que la fenêtre du contrôle soit signalée comme cible de déplacement.Étant donné que le contrôle n'a aucune fenêtre de sa propre, le conteneur utilise sa propre fenêtre comme cible de déplacement.Le contrôle fournit une implémentation de l'interface d' IDropTarget à laquelle le conteneur peut déléguer des appels au moment approprié.Pour exposer cette interface au conteneur, substitution COleControl::GetWindowlessDropTarget.Par exemple :
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}