Partager via


Suivi des modifications apportées aux fenêtres

Les modifications apportées à une fenêtre, y compris une dans un système à plusieurs moniteurs, peuvent être suivies par un pilote de périphérique via un WNDOBJ. Un WNDOBJ est un objet de fenêtre au niveau du pilote qui contient des informations sur la position, la taille et la région client visible d’une fenêtre. Autrement dit, en créant un WNDOBJ qui correspond à une fenêtre d’application, le pilote peut suivre les changements de taille, de position et de région client dans cette fenêtre.

Une application utilise l’API Win32 pour accéder à la fonctionnalité WNDOBJ_SETUP implémentée par le pilote de périphérique. L’accès est obtenu via la fonction ExtEscape Win32. GDI transmet cet appel d’échappement au pilote de périphérique avec DrvEscape, implémenté par le pilote de périphérique avec WNDOBJ_SETUP pour la valeur iEsc.

Une application appelle ExtEscape(hdc, WNDOBJ_SETUP,... ) et transmet un handle à la fenêtre créée par l’application (créée par CreateWindow ou une fonction Win32 équivalente) via la mémoire tampon d’entrée au pilote. Si le pilote doit suivre la fenêtre, il appelle EngCreateWnd, dans le contexte de l’appel ExtEscape , pour créer une structure WNDOBJ pour la fenêtre donnée. À partir de ce point, toute modification apportée à cette fenêtre est transmise au pilote.

Le pilote doit gérer l’appel ExtEscape d’une manière similaire à ce qui suit :

ULONG DrvEscape(
  SURFOBJ *pso,
  ULONG    iEsc,
  ULONG    cjIn,
  PVOID    pvIn,
  ULONG    cjOut,
  PVOID    pvOut)
{
    WNDOBJ *pwo;
    WNDDATA *pwd;

    if (iEsc == WNDOBJ_SETUP)
    {
        pwo = EngCreateWnd(pso,*((HWND *)pvIn),&DrvVideo,
                           WO_RGN_CLIENT, 0);

    // Allocate space for caching client rects. Remember the pointer
    // in the pvConsumer field.

        pwd = EngAllocMem(0, sizeof(WNDDATA), DRIVER_TAG);
        WNDOBJ_vSetConsumer(pwo,pwd);

    // Update the rectangle list for this wndobj.

        vUpdateRects(pwo);
        return(1);
    }

}

La création d’un objet window implique le verrouillage de ressources de fenêtre spéciales. Par conséquent, EngCreateWnd doit être appelé uniquement dans le contexte de l’échappement WNDOBJ_SETUP dans DrvEscape ou DrvSetPixelFormat.

La fonction EngCreateWnd prend en charge le suivi des fenêtres par plusieurs pilotes. Via EngCreateWnd, chaque pilote identifie sa propre routine de rappel que GDI doit appeler pour les modifications apportées à la fenêtre correspondante. Cette fonctionnalité permet, par exemple, à un pilote vidéo en direct de suivre les modifications apportées aux fenêtres vidéo en direct tandis qu’un pilote OpenGL effectue le suivi des modifications apportées aux fenêtres OpenGL.

GDI rappelle le pilote avec les états de fenêtre les plus récents si un nouveau WNDOBJ est créé dans DrvSetPixelFormat ou ExtEscape. GDI rappelle également le pilote lorsqu’une fenêtre référencée par un WNDOBJ est détruite.

En tant qu’accélérateur, le pilote peut accéder aux membres publics de la structure WNDOBJ .

Le suivi des modifications de fenêtre implique l’utilisation de trois fonctions de rappel fournies pour prendre en charge la structure WNDOBJ. La région cliente visible peut être énumérée en appelant les fonctions de rappel WNDOBJ_cEnumStart et WNDOBJ_bEnum . Un pilote peut associer ses propres données à un WNDOBJ en appelant la fonction de rappel WNDOBJ_vSetConsumer .