Implementazione di 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 messaggi. È ora possibile usare la classe in tre modi diversi:
Creazione di una finestra basata su una nuova classe Windows
CWindowImpl
contiene la macro DECLARE_WND_CLASS per dichiarare le informazioni sulla classe di Windows. Questa macro implementa la GetWndClassInfo
funzione , che usa CWndClassInfo per definire le informazioni di una nuova classe Windows. Quando CWindowImpl::Create
viene chiamato, questa classe di Windows viene registrata e viene creata una nuova finestra.
Nota
CWindowImpl
passa NULL alla DECLARE_WND_CLASS
macro, il che significa che ATL genererà un nome di classe di Windows. Per specificare il proprio nome, passare una stringa a DECLARE_WND_CLASS nella CWindowImpl
classe derivata da .
Esempio: Implementare una finestra
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 di CMyWindow
e quindi chiamare il Create
metodo .
Nota
Per eseguire l'override delle informazioni predefinite sulla classe di Windows, implementare il GetWndClassInfo
metodo nella classe derivata impostando i CWndClassInfo
membri sui valori appropriati.
Sovraclassamento di una classe Windows esistente
La macro DECLARE_WND_SUPERCLASS consente di creare una finestra che superclassi una classe Windows esistente. Specificare questa macro nella CWindowImpl
classe derivata da . Come qualsiasi altra finestra ATL, i messaggi vengono gestiti da una mappa messaggi.
Quando si usa DECLARE_WND_SUPERCLASS, verrà registrata una nuova classe di Windows. Questa nuova classe sarà la stessa della classe esistente specificata, ma sostituirà la routine window con CWindowImpl::WindowProc
(o con la funzione che esegue l'override di questo metodo).
Esempio: Sovraclasse la classe Edit
Di seguito è riportato un esempio di una classe che superclassa 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;
}
};
Per creare la finestra Modifica superclassata, creare un'istanza di CMyEdit
e quindi chiamare il Create
metodo .
Creazione di sottoclassi di una finestra esistente
Per sottoclassare una finestra esistente, derivare una classe da CWindowImpl
e dichiarare una mappa messaggi, come nei due casi precedenti. Si noti, tuttavia, che non si specificano informazioni sulle classi di Windows, poiché si sottoclasserà una finestra già esistente.
Anziché chiamare , chiamare Create
SubclassWindow
e passarlo all'handle alla finestra esistente da sottoclasse. Una volta sottoclassata, la finestra userà CWindowImpl::WindowProc
(o la funzione che esegue l'override di questo metodo) per indirizzare i messaggi alla mappa dei messaggi. Per scollegare una finestra sottoclassata dall'oggetto, chiamare UnsubclassWindow
. Verrà quindi ripristinata la routine della finestra originale della finestra.