Domanda

Mi stavo solo chiedendo quale (se ve ne fosse) la differenza tra i seguenti due trap di messaggi in MFC per la funzione, OnSize (..).

1 - Tramite mappa messaggi:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
    ON_WM_SIZE()
..
END_MESSAGE_MAP()

2 - Via afx_message:

afx_msg type OnSize(...);

Sembrano essere usati in modo intercambiabile, quale dovrebbe essere usato o dipende da altri fattori?

È stato utile?

Soluzione

Entrambe le parti sono necessarie per aggiungere un gestore messaggi a una classe. La mappa dei messaggi deve essere dichiarata all'interno della classe, insieme alle dichiarazioni per qualsiasi funzione del gestore messaggi (ad es. OnSize ).

class CClassWnd : public CBaseClassWnd {
    ...
    afx_msg void OnSize(UINT nType, int cx, int cy);
    DECLARE_MESSAGE_MAP
};

afx_msg è solo una macro segnaposto vuota: in realtà non fa nulla, ma è sempre inclusa per convenzione.

La mappa dei messaggi viene quindi definita nel file .cpp della classe:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
    ON_WM_SIZE()
END_MESSAGE_MAP()

Queste macro generano una tabella di ricerca per la classe che consente di inviare i messaggi ricevuti dalla finestra alle corrispondenti funzioni del gestore. La macro ON_WM_SIZE consente di decodificare i parametri del messaggio wParam e lParam nel messaggio WM_SIZE in valori più significativi per la funzione di gestione dei messaggi ( nType , cx e cy in questo caso). MFC fornisce macro per la maggior parte dei messaggi di finestra ( WM_LBUTTONDOWN , WM_DESTROY , ecc.)

Puoi trovare ulteriori informazioni su come funzionano le mappe dei messaggi in MFC qui su MSDN.

Altri suggerimenti

afx_msg è solo una macro vuota, è praticamente solo lì per indicare che il metodo è un gestore di messaggi MFC a fini di leggibilità. Anche con afx_msg è necessario avere ancora una voce nella mappa dei messaggi.

Alcuni dei messaggi di Windows sono già gestiti da MFC , quindi in questi casi puoi evitare di aggiungere solo il metodo alla tua classe derivata.

Ad esempio la classe CWnd (come fanno molte altre classi MFC) mappa già alcuni messaggi di Windows nella sua mappa dei messaggi (ad esempio ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE ecc. ecc.).

Ma qualsiasi altro messaggio non già mappato da MFC dovrà avere sia un metodo di classe che una voce nella mappa dei messaggi affinché funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top