Condividi tramite


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

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 CWindowImplclasse 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 CWindowImplclasse 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 CreateSubclassWindow 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.

Vedi anche

Implementazione di una finestra