Condividi tramite


Gestori per messaggi Windows standard

I gestori predefiniti per i messaggi di Windows standard (WM_) sono predefiniti nella classe CWnd. La libreria di classi basa i nomi per questi gestori sul nome del messaggio. Ad esempio, il gestore per il messaggio WM_PAINT viene dichiarato in CWnd come:

afx_msg void OnPaint();

La parola chiave afx_msg suggerisce l'effetto della parola chiave C++ virtual distinguendo i gestori da altre CWnd funzioni membro. Notare, tuttavia, che queste funzioni non sono effettivamente virtuali; vengono invece implementate attraverso le mappe messaggi. Le mappe messaggi dipendono unicamente da macro standard del preprocessore, non dalle estensioni del linguaggio C++. La parola chiave afx_msg viene risolta in spazi vuoti dopo la pre-elaborazione.

Per eseguire l'override di un gestore definito in una classe base, definire semplicemente una funzione con lo stesso prototipo nella classe derivata e creare una voce nella mappa messaggi per il gestore. Il gestore "esegue l'override" di qualsiasi gestore dello stesso nome in una qualsiasi delle classi base della classe.

In alcuni casi, il gestore deve chiamare il gestore sottoposto a override nella classe base in modo che la classe base e Windows possano agire sul messaggio. Il punto in cui chiamare il gestore della classe base nell'override dipende dalle circostanze. Talvolta è necessario chiamare il gestore della classe base all'inizio e altre volte alla fine. Talvolta è possibile chiamarlo in modo condizionale, se si sceglie di non gestire il messaggio personalmente. Talvolta è necessario chiamare il gestore della classe base, quindi in modo condizionale eseguire il proprio codice del gestore, a seconda del valore o dello stato restituito dal gestore della classe base.

Attenzione

Non è sicuro modificare gli argomenti passati a un gestore se si intende passarli a un gestore di classe base. Ad esempio, si potrebbe essere tentati di modificare l'argomento nChar del gestore ,ad esempio per eseguire la OnChar conversione in maiuscolo. Questo comportamento è piuttosto oscuro, ma se è necessario eseguire questo effetto, usare invece la CWnd funzione SendMessage membro.

Come si determina il modo corretto per eseguire l'override di un determinato messaggio Quando la Creazione guidata classe scrive lo scheletro della funzione del gestore per un determinato messaggio, ad esempio un OnCreate gestore per WM_CREATE, disegna sotto forma di funzione membro sottoposta a override consigliata. L'esempio seguente consiglia al gestore di chiamare prima il gestore della classe base e procedere solo in caso di mancata restituzione di -1.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here

   return 0;
}

Per convenzione, i nomi di questi gestori iniziano con il prefisso "On". Alcuni di questi gestori non accettano argomenti, mentre altri accettano diversi. Alcuni hanno anche un tipo restituito diverso da void. I gestori predefiniti per tutti i messaggi WM_ sono documentati nel riferimento MFC come funzioni membro della classe CWnd i cui nomi iniziano con "On". Le dichiarazioni di funzione membro in CWnd sono precedute da afx_msg.

Vedi anche

Dichiarazioni di funzioni gestore messaggi