Per implementare una finestra, derivare una classe da CWindowImpl. Nella classe derivata, dichiarare una mappa messaggi e le funzioni di gestore del messaggio. È ora possibile utilizzare 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 funzione GetWndClassInfo , che utilizza CWndClassInfo per definire le informazioni di una nuova classe di Windows. Quando viene chiamato CWindowImpl::Create , questa classe di Windows è stata registrata e viene creata una nuova finestra.
&Notanbsp; La macro DECLARE_WND_CLASS , che significa che ATL genererà un nome di classe Windows passa NULL CWindowImpl . Per specificare il tuo nome, passare una stringa a DECLARE_WND_CLASS nel vostro CWindowImpl-classe derivata.
Di seguito è riportato un esempio di una classe che implementa una finestra basata su una nuova classe Windows:
classe CMyWindow: CWindowImpllt pubblica;CMyWindow >,...
{
pubblica:
/ / Se si desidera specificare il nome della nuova classe Windows
DECLARE_WND_CLASS("myName") / / se questa macro non è specificata nel vostro
/ / classe, ATL genererà un nome di classe
...
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER (WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Fare qualche codice di pittura
return 0;
}
}
Per creare una finestra, creare un'istanza di CMyWindow e quindi chiamare il metodo Create.
&Notanbsp; Per eseguire l'override di informazioni sulla classe Windows predefinita, implementare il metodo GetWndClassInfo nella classe derivata impostando i valori appropriati i membri CWndClassInfo.
Creazione di superclassi una classe Windows esistente
La macro DECLARE_WND_SUPERCLASS consente di creare una finestra che le finestre esistenti superclassi classe. Specificare questa macro nel vostro CWindowImpl-classe derivata. Come una qualsiasi finestra ATL, i messaggi vengono gestiti da una mappa messaggi.
Quando si utilizza DECLARE_WND_SUPERCLASS, verrà registrata una nuova classe Windows. Questa nuova classe sarà lo stesso come la classe esistente si specifica, ma andrà a sostituire la routine della finestra con CWindowImpl::WindowProc (o con la funzione che esegue l'override di questo metodo).
In seguito è un esempio di una classe che superclassi modifica standard classe:
classe CMyEdit: CWindowImpllt pubblica;CMyEdit >,...
{
pubblica:
/ / "Edit" è il nome della classe Windows standard.
/ / "MyEdit" è il nome della nuova classe Windows
/ / che sarà basato sulla classe Edit.
DECLARE_WND_SUPERCLASS ("Modifica", "MyEdit")
...
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER (WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Do qualche personaggio codice di gestione
}
}
Per creare la finestra Modifica superclasse, creare un'istanza di CMyEdit e quindi chiamare il metodo Create.
Per ulteriori informazioni sulla creazione di superclassi, vedere Finestra procedura di creazione di superclassi in Win32 SDK.
Creazione di una sottoclasse una finestra esistente
Sottoclasse una finestra esistente, derivare una classe da CWindowImpl e dichiarare una mappa messaggi, come nei due casi precedenti. Si noti, tuttavia, che non si specifica qualsiasi informazione di classe Windows, poiché vi sarà sottoclasse di una finestra già esistente.
Invece di chiamare Create, chiamare SubclassWindow e passargli l'handle alla finestra esistente che si desidera sottoclasse. Una volta che la finestra è una sottoclasse, esso verrà utilizzato CWindowImpl::WindowProc (o la funzione che esegue l'override di questo metodo) per i messaggi diretti a mappa messaggi. Per disconnettere una sottoclasse finestra dal tuo oggetto, chiamare UnsubclassWindow. Poi verrà ripristinata routine della finestra originale della finestra.
Per ulteriori informazioni sulla creazione di sottoclassi, vedere Finestra procedura Subclassing in Win32 SDK.