Pergunta

Eu estava apenas querendo saber o que (se houver) era a diferença entre as seguintes duas armadilhas de mensagens em MFC para a função, OnSize (..).

1 - Via mensagem mapa:

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

2 - Via afx_message:

afx_msg type OnSize(...);

Eles parecem ser usados ??alternadamente, qual deve ser usado ou depende de outros fatores?

Foi útil?

Solução

Ambas as partes são necessárias para adicionar um manipulador mensagem para uma classe. O mapa de mensagem deve ser declarada dentro de sua classe, juntamente com as declarações para quaisquer funções do identificador de mensagem (por exemplo, OnSize).

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

afx_msg é apenas uma macro espaço reservado vazio -. Ele realmente não fazer nada, mas é sempre incluído por convenção

O mapa mensagem é então definido no arquivo .cpp da classe:

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

Estas macros gerar uma tabela de referência para a classe que permite que mensagens recebidas pela janela para ser despachado para as funções de manipulador correspondentes. A macro ON_WM_SIZE permite que os parâmetros wParam e mensagens lParam na mensagem WM_SIZE a ser decodificado em valores mais significativos para a função de manipulador de mensagem (nType, cx e cy neste caso). MFC fornece macros para a maioria das mensagens de janela (WM_LBUTTONDOWN, WM_DESTROY, etc).

Você pode encontrar mais informações sobre como mensagem mapeia trabalho em MFC aqui no MSDN.

Outras dicas

afx_msg é apenas um macro vazio, é basicamente apenas para indicar que o método é um manipulador de mensagens MFC para fins de legibilidade. Mesmo com afx_msg lá você ainda precisa ter uma entrada no mapa de mensagem.

Algumas das mensagens do Windows já são tratados pelo MFC , por isso, nestes casos, você pode ir longe com a adição de apenas o método para a classe derivada.

Por exemplo, o CWnd classe (como fazem muitas outras classes MFC) já mapeia algumas mensagens do Windows para ele do mapa de mensagem (ou seja, ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE etc, etc).

Mas qualquer outra mensagem não já mapeados pelo MFC precisa ter tanto um método de classe e uma entrada no mapa de mensagem para que ele funcione.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top