Neste tutorial, falei sobre as opcoes de botoes que o FXMessageBox fornece ao usuario. Obviamente, cada mensagem requer um conjunto de botoes adequado. Mas como saber qual botao foi pressionado?Hoje, veremos como detectar qual o botao clicado pelo usuario, em resposta a mensagem exibida.Relembrando o conjunto de botoesO prototipo das funcoes que exibem mensagens sao da seguinte forma (message, aqui, e utilizado como um nome generico para information, question, warning e error):static FXuint message(FXWindow* owner, FXuint opts, const char* caption, const char* message, ...);O parametro opts e onde se informa o conjunto de botoes que vao aparecer na mensagem, atraves da seguinte enumeracao (abstraindo os valores):enum { MBOX_OK, MBOX_OK_CANCEL, MBOX_YES_NO, MBOX_YES_NO_CANCEL, MBOX_QUIT_CANCEL, MBOX_QUIT_SAVE_CANCEL, MBOX_SKIP_SKIPALL_CANCEL, MBOX_SAVE_CANCEL_DONTSAVE};Percebam, entao, que os botoes que podem aparecer em uma mensagem sao:OKCancelYesNoQuitSaveDon't saveSkipSkip AllTratando a respostaVoltando ao prototipo da funcao, vemos que ela retorna um FXint. E justamente esse retorno que indica qual o botao pressionado. Esse valor tambem esta presente em uma enumeracao para facilitar (dar nomes a numeros magicos e uma boa pratica de programacao). Essa enumeracao e a seguinte:enum { MBOX_CLICKED_YES = 1, /// The YES button was clicked MBOX_CLICKED_NO = 2, /// The NO button was clicked MBOX_CLICKED_OK = 3, /// The OK button was clicked MBOX_CLICKED_CANCEL = 4, /// The CANCEL button was clicked MBOX_CLICKED_QUIT = 5, /// The QUIT button was clicked MBOX_CLICKED_SAVE = 6, /// The SAVE button was clicked MBOX_CLICKED_SKIP = 7, /// The SKIP button was clicked MBOX_CLICKED_SKIPALL = 8 /// The SKIP ALL button was clicked};Oito valores enumerados para nove botoes?E...Fucando no codigo fonte, descobri algo assim:new FXButton(buttons, "&Don't Save", NULL, this, ID_CLICKED_NO, ...Ou seja, o valor retornado quando o usuario clica em "Don't Save" e MBOX_CLICKED_NO. Faz sentido, mas eu acharia melhor se tivesse um nome especifico, o valor ate poderia ser o mesmo. Mas vai entender...ExemploVou dar um exemplo simples, ate porque aqui nao tem misterio nenhum (fora esse de cima...). Suponha que o usuario vai realizar uma operacao que nao pode ser desfeita. Isso deve ser informado ao usuario, caso ele volte atras em sua decisao. Nosso tratador fica assim:long FoxTutorialMainWindow::onCmdEraseAll(FXObject*, FXSelector sel, void*) { FXuint answer; answer = FXMessageBox::question(this, MBOX_YES_NO, "Apagar tudo", "Essa acao nao pode ser desfeita.\nDeseja continuar?"); switch (answer) { case MBOX_CLICKED_YES: FXMessageBox::information(this, MBOX_OK, "Dados apagados", "Todos os dados foram apagados."); break; case MBOX_CLICKED_NO: FXMessageBox::information(this, MBOX_OK, "Dados nao apagados", "Os dados nao foram apagados."); break; default: break; } return 1;}ResultadoDiscussaoNada de mais aqui. Se o usuario clicou em "Yes", exibe uma mensagem informando que todos os dados foram apagados. Se clicou em "No", informa que nao foram apagados. Realmente sem misterios.ConclusaoEste topico foi apenas um complemento de outro anterior (link). Aqui encerro oficialmente a serie sobre o FXMessageBox. A partir daqui, comecaremos a falar de elementos que compoem uma interface grafica tipica (menus, barras de ferramentas, barra de status etc.). Ate la! Anteriormente, falei aqui como utilizar uma imagem do OpenCV (IplImage) e uma do FOX (FXImage), ambas compartilhando o vetor de pixels. Confira aqui.Pois bem. Fazendo daquela maneira, ha certos problemas: ambos objetos devem permanecer vivos, e o dono dos pixels