Dando continuidade a nossa serie sobre Menus, falarei agora sobre como adicionar submenus. Vamos la.Submenus sao menus como quaisquer outros Isso mesmo. O processo de criar um submenu e praticamente o mesmo de criar um menu "normal".Para exemplificar o processo, vamos criar um menu "Exibir", com um submenu "Zoom". Neste caso, temos dois paineis, que serao declarados da seguinte maneira:FXMenuPane *_viewMenu;FXMenuPane *_zoomMenu;Lembrando que eles devem estar no escopo de classe, pois precisam ser liberados manualmente.Percebam que o submenu "Zoom" nada mais e que um FXMenuPanel como todos os outros que ja vimos ate aqui. Agora vamos cria-los, novamente recuando o codigo para indicar a hierarquia._viewMenu = new FXMenuPane(this); _zoomMenu = new FXMenuPane(this); new FXMenuCommand(_zoomMenu, "&Aumentar\tCtrl++"); new FXMenuCommand(_zoomMenu, "&Normal\tCtrl+0"); new FXMenuCommand(_zoomMenu, "&Diminuir\tCtrl+-"); new FXMenuSeparator(_zoomMenu); new FXMenuCommand(_zoomMenu, "A&justar\tHome"); new FXMenuCascade(_viewMenu, "&Zoom", 0, _zoomMenu);new FXMenuTitle(menuBar, "&Exibir", 0, _viewMenu);Explicando... Na primeira linha, aloco o menu "Exibir".Na segunda, aloco o (sub)menu "Zoom". Chamando atencao para o recuo, indicando que _zoomMenu sera posicionado "dentro" de _viewMenu;Nas linhas seguintes, preencho com alguns comandos e um separador. Nada alem do trivial com recuo.Em seguida, criamos a entrada no menu "Exibir" que vai expandir o menu "Zoom". Repetindo:new FXMenuCascade(_viewMenu, "&Zoom", 0, _zoomMenu);Os parametros sao os mesmos de FXMenuTitle (comparem com a ultima linha):O FXComposite onde ficara localizado o submenu. Neste caso, adicionamos ao painel "Exibir"O titulo que vai aparecer no painel, com direito a mnemonicoIconeO painel que sera exibido ao mover o mouse sobre o titulo.Liberando Como todo bom painel de menu, deve ser liberado manualmente:delete _viewMenu;delete _zoomMenu;So uma observacao: ja tratei esse assunto aqui, entao e so um lembrete. Quando eu falo em deletar manualmente, e porque estou usando o FOX 1.6. Na versao atual de desenvolvimento (1.7), existe uma classe chamada FXAutoPtr, que e um "ponteiro inteligente". Resumindo a historia, ele guarda um ponteiro e automaticamente o libera quando sai de escopo. Veja a descricao aqui (na verdade, uma duvida enviada a lista de discussao do FOX que eu traduzi e postei aqui).Resultado Eis o resultado do nosso submenu: Pode parecer contraditorio (e talvez realmente seja) o titulo deste topico, mas nao vejo onde mais encaixa-lo senao na categoria de Tratamento de Eventos.Acontece que as vezes criamos uma janela que nao precisa tratar nenhum evento em especial, portanto nao necessita do mapa de mensagens. E sobre isso que falarei neste topico.Quando a janela nao trata eventosImagine que voce precisa de uma janela apenas para exibir algumas informacoes. Nenhuma entrada do usuario e necessaria, nenhuma acao do usuario e executada. Essa janela nao precisa tratar evento nenhum, entao nao precisa de um mapa de mensagens.Ainda assim, precisa chamar a macro FXIMPLEMENT.Uma pausa para algumas explicacoesDepois de tantos topicos escritos, so agora senti a necessidade de explicar para que serve esse par de macros: FXDECLARE/FXIMPLEMENT. Confesso que eu simplesmente utilizava, mas sem saber qual o real significado delas. Escrevendo este topico, tive a curiosidade de investiga-las.A macro FXDECLARE, como o proprio nome sugere, e colocada dentro da declaracao da classe. Apos expandida, ela toma a seguinte forma (coloquei espacos para melhorar a legibilidade ):public: struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi;