Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le code de création de fenêtre (autrement dit, tout ce qui se passe lorsque vous appelez CreateWindow) est coûteux à exécuter. Un contrôle qui gère une fenêtre à 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 des fenêtres.
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 les régions d’écran nonrectangulaires. Un exemple courant d’un contrôle transparent est un contrôle de texte avec un arrière-plan transparent. Les contrôles peintnt le texte, mais pas l’arrière-plan, donc tout ce qui se trouve sous le texte s’affiche. Les formulaires plus récents utilisent souvent des contrôles nonrectangulaires, tels que des flèches et des boutons ronds.
Souvent, un contrôle n’a pas besoin d’une fenêtre propre et, à la place, peut utiliser les services de fenêtre de son conteneur, à condition que le conteneur ait été écrit pour prendre en charge les objets sans fenêtre. Les contrôles sans fenêtre sont rétrocompatibles avec les anciens conteneurs. Dans les anciens conteneurs non écrits pour prendre en charge les contrôles sans fenêtre, les contrôles sans fenêtre créent une fenêtre lorsqu’ils sont actifs.
Étant donné que les contrôles sans fenêtre n’ont pas leurs propres fenêtres, le conteneur (qui a une fenêtre) est chargé de fournir des services qui auraient autrement été fournis par la propre fenêtre du contrôle. Par exemple, si votre contrôle doit interroger le focus clavier, capturer la souris ou obtenir un contexte d’appareil, ces opérations sont gérées par le conteneur. Le conteneur dirige les messages d'entrée utilisateur, qui sont envoyés à sa fenêtre, vers le contrôle sans fenêtre approprié, en utilisant l'interface IOleInPlaceObjectWindowless. (Consultez le Kit de développement logiciel (SDK) ActiveX pour obtenir une description de cette interface.) COleControl les fonctions membres appellent ces services à partir du conteneur.
Pour que votre contrôle utilise l’activation sans fenêtre, incluez l’indicateur windowlessActivate dans l’ensemble d’indicateurs retournés 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 à inclure cet indicateur est généré automatiquement si vous sélectionnez l’option d’activation sans fenêtre dans la page 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ègue les messages d’entrée à l’interface du IOleInPlaceObjectWindowless contrôle. COleControlL’implémentation de cette interface répartit les messages via la carte des messages de votre contrôle, après avoir ajusté les coordonnées de la souris de manière appropriée. Vous pouvez traiter les messages comme les messages de fenêtre ordinaires, en ajoutant les entrées correspondantes à la carte des messages. Dans vos gestionnaires de ces messages, évitez d’utiliser la variable membre m_hWnd (ou toute fonction membre qui l’utilise) sans vérifier 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 la fenêtre du conteneur selon le cas, notamment :
Dans les contrôles sans fenêtre, vous devez toujours utiliser les COleControl fonctions membres au lieu des fonctions membres correspondantes CWnd ou de leurs fonctions API Win32 associées.
Vous pouvez souhaiter qu'un contrôle sans fenêtre soit la cible d'une opération glisser-déplacer OLE. Normalement, cela suppose que la fenêtre de contrôle soit stockée en tant que cible de déplacement. Étant donné que le contrôle n’a pas de fenêtre qui lui est propre, le conteneur utilise sa propre fenêtre comme cible de dépôt. Le contrôle fournit une implémentation de l’interface IDropTarget à laquelle le conteneur peut déléguer des appels au moment approprié. Pour exposer cette interface au conteneur, remplacez COleControl ::GetWindowlessDropTarget. Par exemple:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}