Partager via


Implémenter une fenêtre avec CWindowImpl

Pour implémenter une fenêtre, dérivez une classe d' CWindowImpl. Dans votre classe dérivée, déclarez une table des messages et les fonctions gestionnaires de messages. Vous pouvez maintenant utiliser votre classe de trois façons :

  • Créez une fenêtre sur une classe windows

  • Surclassement une classe existante windows

  • Sous-classe une fenêtre existante

Créer une fenêtre sur une classe windows

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

Notes

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

Exemple

Voici un exemple d'une classe qui implémente une fenêtre sur une 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 d' CMyWindow puis appelez la méthode de Créer .

Notes

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

Voici un exemple d'une classe qui surclasse la classe standard de modification :

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 acquérir une surclasse de modification, créez une instance d' CMyEdit puis appelez la méthode de Créer .

Superclassing une classe existante windows

La macro de DECLARE_WND_SUPERCLASS vous permet de créer une fenêtre que les surclasse les fenêtres existantes classe. Spécifiez cette macro dans votre CWindowImplclasse dérivée. Comme toute autre fenêtre ATL, les messages sont gérés par une table des messages.

Lorsque vous utilisez DECLARE_WND_SUPERCLASS, une classe windows sera stockée. Cette classe est la même que la classe existante vous spécifiez, mais remplaceront la procédure de fenêtre par CWindowImpl::WindowProc (ou avec votre fonction qui substituent cette méthode).

Sous-classement une fenêtre existante

Sous-classer une fenêtre existante, dérivent une classe d' CWindowImpl et déclarez une table des messages, comme dans les deux cas précédents. Notez, cependant, que vous ne spécifiez aucune information de classe de fenêtre, comme vous sous-classe une fenêtre existante.

Au lieu d'appeler Créer, appelez SubclassWindow et passez le handle vers la fenêtre existante à sous-classer. Une fois que la fenêtre est sous-classée, il utilisera CWindowImpl::WindowProc (ou la fonction qui substituent cette méthode) pour exécuter des messages dans la table 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 alors restaurée.

Voir aussi

Référence

Implémentation d'une fenêtre