Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Nota
La libreria di modelli attivi (ATL) continua a essere supportata. Tuttavia, non aggiungiamo più funzionalità né aggiorniamo la documentazione.
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
CWindowImplcontiene 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 classe derivata da CWindowImpl.
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 classe derivata CWindowImpl. 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: Definire una superclasse per 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 Create, chiamare SubclassWindow e passargli l'handle alla finestra esistente che si desidera subclassare. 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 procedura finestra originale.