Adrianistán

El blog de Adrián Arroyo


Programando para Haiku - Barras de menús - Parte III

- Adrián Arroyo Calle

Seguimos con los tutoriales de Haiku, hoy veremos como crear barras de menú. Partimos del código de la ventana vacía, lo tienes en la foto junto con el comando de compilación.

MiAplicacionHaikuCodigo Haz click en la imagen para verlo en grande

Debemos saber que en la API de BeOS hay tres clases que nos van a servir.

  • BMenuBar, se trata de la barra en sí, que esta pegada a la ventana. Un BMenuBar contiene BMenus.

  • BMenu, son los menús en sí. Un menú es un elemento que contiene acciones, organizadas como si fuera una lista. Los menús no definen acciones, pero sí su organización. Así, a un BMenu le tendremos que añadir BMenuItems u otro BMenus (menús anidados).

  • BMenuItem, son las acciones de los menús. Cada BMenuItem tiene la capacidad de generar un BMessage nuevo, listo para ser procesado por nuestra aplicación.


En la imagen se puede ver perfectamente

BMenu

Vamos a crear una barra de menú con dos menús, uno de ellos simple y otro con un menú anidado y un separador.


#include <AppKit.h>
#include <InterfaceKit.h>
#include <InterfaceDefs.h>

#define NEW_FILE 3
#define EXPORT_AS 5

class VentanaPrueba : public BWindow{
public:
VentanaPrueba() : BWindow(BRect(100,100,900,700),"Mi ventana",B_TITLED_WINDOW,0){
AddChild(CreateMenuBar());
}
bool QuitRequested(){
be_app_messenger.SendMessage(B_QUIT_REQUESTED);
return BWindow::QuitRequested();
}
void MessageReceived(BMessage* msg){
switch(msg->what){
default:
BWindow::MessageReceived(msg);
}
}
BMenuBar* CreateMenuBar(){
BMenuBar* bar = new BMenuBar(BRect(0,0,100,20),"MenuBar");

BMenu* file = new BMenu("File");
BMenu* help = new BMenu("Help");
BMenu* exportMenu = new BMenu("Export");

bar->AddItem(file);
bar->AddItem(help);

/* FILE */
BMenuItem* newFile = new BMenuItem("New file",new BMessage(NEW_FILE));
newFile->SetShortcut('N',B_COMMAND_KEY);
file->AddItem(newFile);

file->AddItem(exportMenu);
file->AddSeparatorItem();

BMenuItem* quit = new BMenuItem("Quit",new BMessage(B_QUIT_REQUESTED));
quit->SetShortcut('Q',B_COMMAND_KEY);
file->AddItem(quit);

/* EXPORT */
BMenuItem* exportAs = new BMenuItem("Export as...",new BMessage(EXPORT_AS));
exportMenu->AddItem(exportAs);

/* HELP */
BMenuItem* helpVersion = new BMenuItem("Help",NULL);
help->AddItem(helpVersion);

return bar;
}
};

class AplicacionPrueba : public BApplication{
public:
VentanaPrueba* ventana;
AplicacionPrueba() : BApplication("application/x-aplicacion-prueba"){
ventana = new VentanaPrueba();
ventana->Show();
}
};

int main(int argc, char** argv){
AplicacionPrueba app;
return app.Run();
}


Y el resultado es el siguiente:

BMenuBar

Como vemos, SetShortcut hace que los menús sean seleccionables con combinaciones de teclado. Hay que tener en cuenta que en BeOS, la tecla que en Windows normalmente Ctrl, es Alt. Así operaciones como copiar y pegar con Alt+C y Alt+V. Para responder al evento solo hace falta escuchar en la función MessageReceived. En el caso de B_QUIT_REQUESTED, el mensaje ya está implementado en la función QuitRequested.

Comentarios

Añadir comentario

Todos los comentarios están sujetos a moderación