O mapa de mensagens e, digamos assim, o cerne do tratamento de eventos no FOX Toolkit. E ele quem determina que callback deve ser chamado em resposta a que tipo de mensagem, enviada por um determinado objeto.Neste topico, explicarei com mais detalhes como funciona o mapa. Vamos la.Definicao do mapaO mapa de mensagens e definido atraves da macro FXDEFMAP. Essa macro recebe um parametro, que e o nome da classe. Com esta macro, declara-se um vetor onde sao armazenados os mapeamentos de mensagens; essa macro expandida nada mais e que uma declaracao de uma variavel normal. Seguindo o exemplo dos nossos tutoriais, temos o seguinte:FXDEFMAP(FoxTutorialMainWindow) FoxTutorialMainWindowMap[] = {};Essa macro (que termina com o parentese fechado) e expandida na seguinte declaracao:static const FoxTutorialMainWindowMap::FXMapEntry FoxTutorialMainWindowMap[] = {};Sendo que FXMapEntry e uma struct interna criada automaticamente pela macro FXDECLARE, chamada ao declararmos a classe FoxTutorialMainWindow (lembram?). Ou seja, estamos declarando um vetor de entradas do mapa de mensagem.Percebam o nome do vetor de mapeamento. Aqui temos um padrao de nomenclatura: o nome do vetor e composto pelo nome da classe com o sufixo "Map".Dentro deste vetor, colocamos os mapeamentos em si. Isto e feito com auxilio da macro FXMAPFUNC, que veremos em seguida.Adicionando mapeamentosA macro FXMAPFUNC recebe tres parametros: o tipo da mensagem, o ID da mensagem e um ponteiro para o callback. Tomando como exemplo este tutorial, adicionamos os seguintes mapeamentos:FXMAPFUNC(SEL_COMMAND, FoxTutorialMainWindow::ID_INFORMATION, FoxTutorialMainWindow::onCmdMessage),FXMAPFUNC(SEL_COMMAND, FoxTutorialMainWindow::ID_QUESTION, FoxTutorialMainWindow::onCmdMessage),FXMAPFUNC(SEL_COMMAND, FoxTutorialMainWindow::ID_WARNING, FoxTutorialMainWindow::onCmdMessage),FXMAPFUNC(SEL_COMMAND, FoxTutorialMainWindow::ID_ERROR, FoxTutorialMainWindow::onCmdMessage),Tipo de mensagemInforma qual o tipo de evento que foi disparado: um comando, um clique do mouse, uma tecla pressionada, uma janela redimensionada etc.Teremos um topico exclusivo (ou varios topicos...) para discutir os diferentes tipos de mensagem.ID da mensagemDe certa maneira, identifica quem enviou a mensagem. Junto com o tipo da mensagem, tem-se uma combinacao suficiente para dizer que acao (callback) deve ser executada. Essa combinacao deve ser unica, portanto uma declaracao como a seguinte nao e valida:FXMAPFUNC(SEL_COMMAND, ID_ACTION, onCmdAction1),FXMAPFUNC(SEL_COMMAND, ID_ACTION, onCmdAction2),Neste caso, tentamos fazer com que a mesma mensagem ative duas acoes, o que na realidade nao ocorre. E possivel, entretanto, combinar a mesma mensagem com diferentes tipos, podendo ou nao executar a mesma acao. Por exemplo, eu tenho um canvas (area de desenho) que deve executar uma determinada acao quando o mouse for clicado e outra quando for redimensionado. Como e um objeto so, ele vai ter apenas um ID, diga-se ID_CANVAS. No mapa, teremos (para efeito de exemplo, vou omitir o escopo dos identificadores; compare com os exemplos reais acima):FXMAPFUNC(SEL_CLICKED, ID_CANVAS, onCanvasClick),FXMAPFUNC(SEL_CONFIGURE, ID_CANVAS, onCanvasConfigure),E possivel, ainda, que um mesmo ID, com diferentes tipos de mensagem, execute a mesma acao. Digamos que nosso canvas trate igualmente o clique com o botao esquerdo e direito do mouse:FXMAPFUNC(SEL_LEFTBUTTONPRESS, ID_CANVAS, onCanvasClick),FXMAPFUNC(SEL_RIGHTBUTTONPRESS, ID_CANVAS, onCanvasClick),Resumindo, apenas a combinacao <tipo de mensagem, id da mensagem> deve ser unica.Ponteiro para o callbackE exatamente isso: um ponteiro para a funcao membro, que foi declarada na classe (e, naturalmente, deve estar devidamente implementada). Realmente nao ha muito o que dizer aqui.Observacoes finaisNos exemplos didaticos, eu removi o escopo dos identificadores (id e ponteiros de funcao) por motivos de espaco. E necessario fornece-los pelo