Partager via


TN003 : mappage des handles de fenêtres aux objets

Cette remarque décrit les routines MFC qui prennent en charge les handles d'objet de fenêtres de mappage aux objets C++.

Le problème

Les objets de fenêtres sont en général représentés par différents objets de HANDLE les handles d'objet de fenêtres d'enveloppe de classes MFC avec les objets C++.Les fonctions d'habillage du handle de la bibliothèque de classes MFC vous permettent de rechercher l'objet C++ qui encapsule l'objet de fenêtres qui a un handle particulier.Toutefois, un objet n'a pas l'objet de wrapper C++ et à l'heure le système crée un objet temporaire pour servir de wrapper C++.

Les objets de fenêtre que les tables de handles d'application sont les suivantes :

  • HWND (CWnd et CWndclasses dérivées)

  • HDC (CDC et CDCclasses dérivées)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

Étant donné un handle à l'un de ces objets, vous pouvez rechercher l'objet MFC qui encapsule le handle en appelant la méthode statique FromHandle.Par exemple, étant donné un HWND hWndappelé, la ligne suivante retourne un pointeur vers CWnd qui encapsule hWnd:

CWnd::FromHandle(hWnd)

Si hWnd n'a pas d'objet spécifique de wrapper, CWnd temporaire est créé pour encapsuler hWnd.Cela permet ainsi d'obtenir un objet C++ valide de tout handle.

Une fois que vous avez un objet de wrapper, vous pouvez récupérer son handle d'une variable membre public de la classe wrapper.Dans le cas de CWnd, m_hWnd contient le HWND de cet objet.

Joindre des handles des objets MFC

Étant donné un objet nouvellement créé de handle-wrapper et un handle vers un objet de fenêtre, vous pouvez associer les deux en appelant la fonction de Attach comme dans cet exemple :

CWnd myWnd;
myWnd.Attach(hWnd);

Cette information dans la carte permanente associant myWnd et hWnd.Appelant CWnd::FromHandle(hWnd) retourne maintenant un pointeur vers myWnd.Lorsque myWnd est supprimé, le destructeur détruira automatiquement hWnd en appelant la fonction de DestroyWindow windows.Si cela n'est pas souhaité, hWnd doit être détaché d' myWnd avant qu' myWnd soit détruit (normalement en quittant la portée à laquelle myWnd a été défini).La méthode d' Detach fait.

myWnd.Detach();

Plus sur les objets temporaires

Les objets temporaires sont créés à chaque fois qu' FromHandle reçoit un handle qui ne possède pas déjà un objet de wrapper.Ces objets temporaires sont détachés et de leur handle et supprimé par DeleteTempMap s'exécute.Par défaut CWinThread::OnIdle appelle automatiquement DeleteTempMap pour chaque classe qui prend en charge les cartes temporaires de handle.Cela signifie que vous ne pouvez pas supposer qu'un pointeur vers un objet temporaire sera valide au delà de le point de sortie de la fonction où le pointeur a été obtenu.

Objets et plusieurs threads de wrapper

Les objets temporaires et permanents sont conservés sur une base par thread.En d'autres termes, un thread ne peut pas accéder aux objets de wrapper du C++ d'un autre thread, qu'il soit temporaire ou permanent.

Pour passer ces objets d'un thread à un autre, envoyez-toujours les comme type natif d' HANDLE .Passer l'objet de wrapper C++ d'un thread à un autre entraîne souvent des résultats inattendus.

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie