Implementare una finestra con CWindowImpl
Per implementare una finestra, derivare una classe da CWindowImpl.Nella classe derivata, dichiarare una mappa messaggi e le funzioni del gestore.È ora possibile utilizzare la classe in tre modi diversi:
Creazione di una finestra basata su una nuova classe di Windows
Superclasse una classe esistente di Windows
Sottoclasse di una finestra esistente
Creazione di una finestra basata su una nuova classe di Windows
CWindowImpl contiene la macro DECLARE_WND_CLASS per dichiarare le informazioni sulle classi di Windows.Questa macro implementa la funzione GetWndClassInfo, che utilizza CWndClassInfo per definire le informazioni della nuova classe di Windows.Quando CWindowImpl::Create viene chiamato, questa classe di Windows viene registrata e una nuova finestra viene creata.
[!NOTA]
CWindowImpl passa NULL alla macro DECLARE_WND_CLASS, ovvero ATL genera un nome di classe di Windows.Per specificare il nome, passare una stringa in DECLARE_WND_CLASS nel CWindowImplclasse derivata da.
Esempio
Di seguito è riportato un esempio di una classe che implementa una finestra basata su una nuova classe di 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;
}
};
Per creare una finestra, creare un'istanza CMyWindow quindi chiamare il metodo Crea.
[!NOTA]
Per eseguire l'override delle informazioni sulle classi predefinite di Windows, implementare il metodo GetWndClassInfo nella classe derivata impostando i membri CWndClassInfo i valori appropriati.
Di seguito è riportato un esempio di classe che superiore alla classe standard di modifica:
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;
}
};
Per creare la finestra impostato come superclasse di modifica, creare un'istanza CMyEdit quindi chiamare il metodo Crea.
Una superclasse basata su una classe esistente di Windows
La macro DECLARE_WND_SUPERCLASS consente di creare una finestra che superiore una classe esistente di Windows.Specificare questa macro nel CWindowImplclasse derivata da.Come qualsiasi altra finestra ATL, i messaggi vengono gestiti da una mappa messaggi.
Quando si utilizza DECLARE_WND_SUPERCLASS, una nuova classe di Windows verrà registrata.Questa nuova classe sarà uguale alla classe esistente si specifica, ma sostituire la routine della finestra con CWindowImpl::WindowProc (o alla funzione che esegue l'override di questo metodo.
Creazione di una sottoclasse di una finestra esistente
Creare una sottoclasse di una finestra esistente, derivare una classe da CWindowImpl e dichiarare una mappa messaggi, ad esempio nei due casi precedenti.Si noti, tuttavia, non si specificano alcune informazioni sulle classi Windows, poiché sottoclasse di una finestra già esistente.
Anziché chiamare Crea, chiamare SubclassWindow e passare l'handle della finestra esistente che si desidera creare una sottoclasse.Una volta che la finestra è impostata come sottoclasse, utilizzerà CWindowImpl::WindowProc (o la funzione che esegue l'override di questo metodo per indirizzare i messaggi alla mappa messaggi.Per rimuovere una finestra impostata come sottoclasse dall'oggetto, chiamare UnsubclassWindow.La routine della finestra originale della finestra verrà ripristinata.