Classe CWindowImpl

Fornisce metodi per la creazione di una finestra o di una sottoclasse di finestra.

Importante

Questa classe e i relativi membri non possono essere usati nelle applicazioni eseguite in Windows Runtime.

Sintassi

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>

Parametri

T
La nuova classe, derivata da CWindowImpl.

TBase
Classe base della classe. Per impostazione predefinita, la classe base è CWindow.

TWinTraits
Classe traits che definisce gli stili per la finestra. Il valore predefinito è CControlWinTraits.

Membri

Metodi pubblici

Nome Descrizione
CWindowImpl::Create Crea una finestra.

Metodi CWindowImplBaseT

Nome Descrizione
DefWindowProc Fornisce l'elaborazione dei messaggi predefinita.
GetCurrentMessage Restituisce il messaggio corrente.
GetWindowProc Restituisce la procedura della finestra corrente.
OnFinalMessage Chiamato dopo la ricezione dell'ultimo messaggio (in genere WM_NCDESTROY).
SottoclasseWindow Crea una sottoclasse di una finestra.
UnsubclassWindow Ripristina una finestra precedentemente impostata come sottoclasse.

Metodi statici

Nome Descrizione
GetWndClassInfo Restituisce un'istanza statica di CWndClassInfo, che gestisce le informazioni sulla classe della finestra.
WindowProc Elabora i messaggi inviati alla finestra.

Membri dei dati

Nome Descrizione
m_pfnSuperWindowProc Punta alla procedura della finestra originale della classe della finestra.

Osservazioni:

È possibile usare CWindowImpl per creare una finestra o una sottoclasse di una finestra esistente. la CWindowImpl procedura della finestra usa un mapping dei messaggi per indirizzare i messaggi ai gestori appropriati.

CWindowImpl::Create crea una finestra in base alle informazioni sulla classe della finestra gestite da CWndClassInfo. CWindowImpl contiene la macro DECLARE_WND_CLASS , ovvero CWndClassInfo registra una nuova classe finestra. Se si vuole sovraclassare una classe finestra esistente, derivare la classe da CWindowImpl e includere la macro DECLARE_WND_SUPERCLASS . In questo caso, CWndClassInfo registra una classe della finestra basata su una classe esistente, ma utilizza CWindowImpl::WindowProc. Ad esempio:

class ATL_NO_VTABLE CMyWindow :
   OtherInheritedClasses
   public CComControl<CMyWindow>
          // CComControl derives from CWindowImpl
{
public:
   // 1. The NULL parameter means ATL will generate a
   //    name for the superclass
   // 2. The "EDIT" parameter means the superclass is
   //    based on the standard Windows Edit box
   DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))

   // Remainder of class declaration omitted

Nota

Poiché CWndClassInfo gestisce le informazioni per una sola classe della finestra, ogni finestra creata tramite un'istanza di CWindowImpl è basata sulla stessa classe della finestra.

CWindowImpl supporta inoltre la creazione di una sottoclasse della finestra. Il metodo SubclassWindow associa una finestra esistente all'oggetto CWindowImpl e modifica la procedura della finestra in CWindowImpl::WindowProc. Ogni istanza di CWindowImpl può creare una sottoclasse di una finestra diversa.

Nota

Per qualsiasi oggetto specificato CWindowImpl , chiamare Create o SubclassWindow. Non richiamare entrambi i metodi sullo stesso oggetto.

Oltre a CWindowImpl, ATL fornisce CContainedWindow per creare una finestra contenuta in un altro oggetto.

Il distruttore della classe di base (~ CWindowImplRoot) garantisce che la finestra venga eliminata prima che l'oggetto venga eliminato definitivamente.

CWindowImplderiva da , che deriva da CWindowImplBaseTCWindowImplRoot, che deriva da TBase e CMessageMap.

Per ulteriori informazioni su Vedere
Creazione di controlli Esercitazione ATL
Uso delle finestre in ATL Classi di finestra ATL
Creazione guidata progetto ATL Creazione di un progetto ATL

Gerarchia di ereditarietà

CMessageMap

TBase

CWindowImplRoot

CWindowImplBaseT

CWindowImpl

Requisiti

Intestazione: atlwin.h

CWindowImpl::Create

Crea una finestra basata su una nuova classe finestra.

HWND Create(
    HWND hWndParent,
    _U_RECT rect = NULL,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

Parametri

hWndParent
[in] Handle per la finestra padre o proprietario.

rect
[in] Struttura RECT che specifica la posizione della finestra. L'oggetto RECT può essere passato dal puntatore o dal riferimento.

szWindowName
[in] Specifica il nome della finestra. Il valore predefinito è NULL.

dwStyle
[in] Stile della finestra. Questo valore viene combinato con lo stile fornito dalla classe traits per la finestra. Il valore predefinito fornisce alla classe traits il controllo completo sullo stile. Per un elenco dei valori possibili, vedere CreateWindow in Windows SDK.

dwExStyle
[in] Stile della finestra estesa. Questo valore viene combinato con lo stile fornito dalla classe traits per la finestra. Il valore predefinito fornisce alla classe traits il controllo completo sullo stile. Per un elenco dei valori possibili, vedere CreateWindowEx in Windows SDK.

MenuOrID
[in] Per una finestra figlio, l'identificatore della finestra. Per una finestra di primo livello, un handle di menu per la finestra. Il valore predefinito è 0U.

lpCreateParam
[in] Puntatore ai dati di creazione della finestra. Per una descrizione completa, vedere la descrizione del parametro finale per CreateWindowEx.

Valore restituito

In caso di esito positivo, l'handle nella finestra appena creata. In caso contrario, NULL.

Osservazioni:

Create registra prima di tutto la classe della finestra se non è ancora stata registrata. La finestra appena creata viene collegata automaticamente all'oggetto CWindowImpl .

Nota

Non chiamare Create se è già stato chiamato SubclassWindow.

Per usare una classe window basata su una classe finestra esistente, derivare la classe da CWindowImpl e includere la macro DECLARE_WND_SUPERCLASS . La routine della finestra della classe finestra esistente viene salvata in m_pfnSuperWindowProc. Per altre informazioni, vedere la panoramica di CWindowImpl .

Nota

Se 0 viene usato come valore per il parametro MenuOrID , deve essere specificato come 0U (valore predefinito) per evitare un errore del compilatore.

CWindowImpl::D efWindowProc

Chiamato da WindowProc per elaborare i messaggi non gestiti dalla mappa dei messaggi.

LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

LRESULT DefWindowProc();

Parametri

uMsg
[in] Messaggio inviato alla finestra.

wParam
[in] Informazioni aggiuntive specifiche del messaggio.

lParam
[in] Informazioni aggiuntive specifiche del messaggio.

Valore restituito

Risultato dell'elaborazione del messaggio.

Osservazioni:

Per impostazione predefinita, DefWindowProc chiama la funzione CallWindowProc Win32 per inviare le informazioni del messaggio alla routine della finestra specificata in m_pfnSuperWindowProc.

La funzione senza parametri recupera automaticamente i parametri necessari dal messaggio corrente.

CWindowImpl::GetCurrentMessage

Restituisce il messaggio corrente, incluso nella MSG struttura .

const MSG* GetCurrentMessage();

Valore restituito

Messaggio corrente.

CWindowImpl::GetWindowProc

Restituisce WindowProc, la routine della finestra corrente.

virtual WNDPROC GetWindowProc();

Valore restituito

Routine della finestra corrente.

Osservazioni:

Eseguire l'override di questo metodo per sostituire la routine window con la propria.

CWindowImpl::GetWndClassInfo

Chiamato da Create per accedere alle informazioni sulla classe della finestra.

static CWndClassInfo& GetWndClassInfo();

Valore restituito

Istanza statica di CWndClassInfo.

Osservazioni:

Per impostazione predefinita, CWindowImpl ottiene questo metodo tramite la macro DECLARE_WND_CLASS , che specifica una nuova classe finestra.

Per sovraclassare una classe finestra esistente, derivare la classe da CWindowImpl e includere la macro DECLARE_WND_SUPERCLASS per eseguire l'override GetWndClassInfodi . Per altre informazioni, vedere la panoramica di CWindowImpl .

Oltre a usare le macro DECLARE_WND_CLASS e DECLARE_WND_SUPERCLASS, è possibile eseguire l'override con la propria implementazione GetWndClassInfo .

CWindowImpl::m_pfnSuperWindowProc

A seconda della finestra, punta a una delle procedure della finestra seguenti.

WNDPROC m_pfnSuperWindowProc;

Osservazioni:

Tipo di finestra Procedura finestra
Finestra basata su una nuova classe di finestra, specificata tramite la macro DECLARE_WND_CLASS . Funzione DefWindowProc Win32.
Finestra basata su una classe window che modifica una classe esistente, specificata tramite la macro DECLARE_WND_SUPERCLASS . Routine della finestra della classe finestra esistente.
Finestra sottoclassata. Routine della finestra originale della finestra sottoclassata.

CWindowImpl::D efWindowProc invia informazioni sul messaggio alla routine della finestra salvata in m_pfnSuperWindowProc.

CWindowImpl::OnFinalMessage

Chiamato dopo aver ricevuto l'ultimo messaggio (in genere WM_NCDESTROY).

virtual void OnFinalMessage(HWND hWnd);

Parametri

hWnd
[in] Handle per la finestra distrutta.

Osservazioni:

L'implementazione predefinita di non esegue alcuna operazione, ma è possibile eseguire l'override di questa funzione per gestire la pulizia prima di OnFinalMessage eliminare una finestra. Se si desidera eliminare automaticamente l'oggetto dopo la distruzione della finestra, è possibile chiamare delete this; in questa funzione.

CWindowImpl::SubclassWindow

Sottoclassa la finestra identificata da hWnd e la collega all'oggetto CWindowImpl .

BOOL SubclassWindow(HWND hWnd);

Parametri

hWnd
[in] Handle della finestra sottoclassata.

Valore restituito

TRUE se la finestra viene sottoclassata correttamente; in caso contrario, FALSE.

Osservazioni:

La finestra sottoclassata usa ora CWindowImpl::WindowProc. La procedura della finestra originale viene salvata in m_pfnSuperWindowProc.

Nota

Non chiamare SubclassWindow se è già stato chiamato Create.

CWindowImpl::UnsubclassWindow

Scollega la finestra sottoclassata dall'oggetto CWindowImpl e ripristina la routine della finestra originale, salvata in m_pfnSuperWindowProc.

HWND UnsubclassWindow();

Valore restituito

Handle della finestra precedentemente sottoclassata.

CWindowImpl::WindowProc

Questa funzione statica implementa la routine window.

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

Parametri

hWnd
[in] Handle per la finestra.

uMsg
[in] Messaggio inviato alla finestra.

wParam
[in] Informazioni aggiuntive specifiche del messaggio.

lParam
[in] Informazioni aggiuntive specifiche del messaggio.

Valore restituito

Risultato dell'elaborazione del messaggio.

Osservazioni:

WindowProc usa la mappa dei messaggi predefinita (dichiarata con BEGIN_MSG_MAP) per indirizzare i messaggi ai gestori appropriati. Se necessario, WindowProc chiama DefWindowProc per un'ulteriore elaborazione dei messaggi. Se il messaggio finale non viene gestito, WindowProc esegue le operazioni seguenti:

  • Esegue unsubclassing se la finestra non è stata sottoclassata.

  • m_hWndCancella .

  • Chiama OnFinalMessage prima che la finestra venga eliminata definitivamente.

È possibile eseguire l'override WindowProc per fornire un meccanismo diverso per la gestione dei messaggi.

Vedi anche

BEGIN_MSG_MAP
Classe CComControl
Cenni preliminari sulla classe