Condividi tramite


Implementazione di una finestra con CWindowImpl

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.

Vedi anche

Implementazione di una finestra