Mise en œuvre d'une fenêtre avec CWindowImpl

Pour implémenter une fenêtre, dérivez une classe de CWindowImpl. Dans votre classe dérivée, déclarer une carte message et les fonctions de gestionnaire de message. Vous pouvez maintenant utiliser votre classe de trois façons différentes:

Création d'une fenêtre basée sur une nouvelle classe de Windows

CWindowImpl contient la macro DECLARE_WND_CLASS pour déclarer des informations de classe Windows. Cette macro implémente la fonction GetWndClassInfo , qui utilise CWndClassInfo pour définir les informations d'une nouvelle classe de Windows. Lorsque CWindowImpl::Create est appelé, cette classe de Windows est enregistrée et une nouvelle fenêtre est créée.

&Notenbsp ;CWindowImpl passe NULL à la macro DECLARE_WND_CLASS , qui signifie QU'ATL génère un nom de classe Windows. Pour spécifier votre propre nom, passer une chaîne à DECLARE_WND_CLASS dans votre CWindowImpl-classe dérivée.

Voici un exemple d'une classe qui implémente une fenêtre basée sur une nouvelle classe de Windows:

class CMyWindow : public CWindowImpllt ;CMyWindow >,...
{
public :
   / / Spécifier le nom de la nouvelle classe de Windows
   DECLARE_WND_CLASS("myname") / / si cette macro n'est pas spécifiée dans votre
              / / classe ATL génère un nom de classe
   ...

BEGIN_MSG_MAP(CMyWindow)
      MESSAGE_HANDLER (WM_PAINT, OnPaint)
   END_MSG_MAP()

LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      / / Faire un code de peinture
      return 0 ;
   }
}

Pour créer une fenêtre, créer une instance de CMyWindow et appelez ensuite la méthode Create.

&Notenbsp ;  Pour substituer les informations de classe Windows par défaut, implémenter la méthode GetWndClassInfo dans votre classe dérivée en définissant les valeurs appropriées les membres CWndClassInfo.

Surclassement d'une classe existante de Windows

La macro DECLARE_WND_SUPERCLASS vous permet de créer une fenêtre qui surclasse un Windows existant classe. Spécifiez cette macro dans votre CWindowImpl-classe dérivée. Comme toutes les autres fenêtres ATL, les messages sont traités par une carte message.

Lorsque vous utilisez DECLARE_WND_SUPERCLASS, une nouvelle classe de Windows sera enregistrée. Cette nouvelle classe sera la même que la classe existante que vous spécifiez, mais va remplacer la procédure de fenêtre avec CWindowImpl::WindowProc (ou avec votre fonction qui substitue cette méthode).

Suivant est un exemple d'une classe qui surclasse l'Edition standard classe:

class CMyEdit : public CWindowImpllt ;CMyEdit >,...
{
public :
   / « Edit » est le nom de la classe Windows standard.
   / « MyEdit » est le nom de la nouvelle classe de Windows
   / / qui va être basé sur la classe Edit.
   DECLARE_WND_SUPERCLASS ("Edit", « MyEdit »)

...
   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER (WM_CHAR, OnChar)
   END_MSG_MAP()

LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      / / Do certains caractères code de gestion
   }
}

Pour créer la fenêtre d'édition surclasse, créez une instance de CMyEdit et appelez ensuite la méthode Create.

Pour plus d'informations sur le surclassement, voir Fenêtre procédure surclassement dans le SDK Win32.

Sous-classement d'une fenêtre existante

Sous-classe une fenêtre existante, dérivez une classe de CWindowImpl et déclarer une carte message, comme dans les deux cas précédents. Notez, cependant, que vous ne spécifiez pas les informations de classe Windows, puisque vous aurez sous-classe une fenêtre déjà existante.

Au lieu d'appeler Create, appelez SubclassWindow et passer le handle de la fenêtre existante que vous souhaitez la sous-classe. Une fois que la fenêtre est sous-classée, il utilise CWindowImpl::WindowProc (ou votre fonction qui substitue cette méthode) aux messages directs à la carte de message. Pour détacher une fenêtre sous-classé à partir de votre objet, appelez UnsubclassWindow. Procédure de fenêtre d'origine de la fenêtre sera ensuite rétabli.

Pour plus d'informations sur sous-classement, voir Fenêtre procédure sous-classement du SDK Win32.

Index