Partager via


Implémentation 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éclarez un mappage de messages et les fonctions du gestionnaire de messages. Vous pouvez maintenant utiliser votre classe de trois façons différentes :

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

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

Remarque

CWindowImpl transmet NULL à la DECLARE_WND_CLASS macro, ce qui signifie qu’ATL génère un nom de classe Windows. Pour spécifier votre propre nom, passez une chaîne à DECLARE_WND_CLASS dans votre CWindowImplclasse dérivée.

Exemple : Implémenter une fenêtre

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

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

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

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some painting code
      return 0;
   }

};

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

Remarque

Pour remplacer les informations de classe Windows par défaut, implémentez la GetWndClassInfo méthode dans votre classe dérivée en définissant les membres sur les CWndClassInfo valeurs appropriées.

Superclassement d’une classe Windows existante

La macro DECLARE_WND_SUPERCLASS vous permet de créer une fenêtre qui superclasse une classe Windows existante. Spécifiez cette macro dans votre CWindowImplclasse dérivée. Comme toute autre fenêtre ATL, les messages sont gérés par une carte de messages.

Lorsque vous utilisez DECLARE_WND_SUPERCLASS, une nouvelle classe Windows est inscrite. Cette nouvelle classe sera la même que la classe existante que vous spécifiez, mais remplacera la procédure CWindowImpl::WindowProc de fenêtre par (ou par votre fonction qui remplace cette méthode).

Exemple : Superclasse la classe Edit

Voici un exemple de classe qui superclasse la classe Edit standard :

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

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

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some character handling code
      return 0;
   }
};

Pour créer la fenêtre Edit surclassée, créez une instance de CMyEdit la méthode, puis appelez la Create méthode.

Sous-classe d’une fenêtre existante

Pour sous-classer une fenêtre existante, dérivez une classe et déclarez un mappage de CWindowImpl messages, comme dans les deux cas précédents. Notez toutefois que vous ne spécifiez aucune information de classe Windows, car vous allez sous-classer une fenêtre déjà existante.

Au lieu d’appeler Create, appelez SubclassWindow et transmettez-le au handle à la fenêtre existante que vous souhaitez sous-classe. Une fois la fenêtre sous-classée, elle utilise CWindowImpl::WindowProc (ou votre fonction qui remplace cette méthode) pour diriger les messages vers la carte des messages. Pour détacher une fenêtre sous-classée de votre objet, appelez UnsubclassWindow. La procédure de fenêtre d’origine de la fenêtre sera ensuite restaurée.

Voir aussi

Implémentation d’une fenêtre