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 CWindowImpl
classe 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 CWindowImpl
classe 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.