Documente Academic
Documente Profesional
Documente Cultură
En este captulo se describen los diferentes tipos de mens que ofrece el kit de
herramientas Motif. Tambin presenta una serie de formas de crear mens en una
aplicacin y habla de los temas involucrados en el diseo de sistemas de men.
Mens proporcionan al usuario un conjunto de opciones en una aplicacin sin
complicar su aspecto visual normal. Estos convenientes mini-cajas de
herramientas son esenciales para el usuario que, al igual que un mecnico de
automviles que est ocupado trabajando por debajo del coche, necesita un
acceso rpido y conveniente a sus herramientas sin tener que mirar o alejarse de
su trabajo. La Gua motivo de estilo prev tres diferentes tipos de mens:
PulldownMenus, PopupMenus, y OptionMenus. A pesar de las diferencias entre
los tres tipos de mens, todos ellos proporcionan el acceso fcil y cmodo a la
funcionalidad de la aplicacin.
Un PulldownMenu
Bajo ciertas condiciones, puede ser un inconveniente para el usuario para detener
lo que est haciendo, mueva el ratn a la barra del men para desplegar un men,
y luego mover el ratn de nuevo a donde estaba trabajando. Tener que mover el
ratn de distancia, incluso a otra parte de la misma ventana, puede reducir la
productividad.
A PopupMenu es una solucin a este problema ya que puede proporcionar el
acceso inmediato a la funcionalidad de la aplicacin. PopupMenus se registr
utilizando el tercer botn del ratn y se puede visualizar en cualquier lugar de
una aplicacin. En lugar de tener que mover el ratn, el usuario puede
simplemente pulsar el tercer botn del ratn para hacer que aparezca una
PopupMenu en el acto. Este tipo de men no necesita estar asociado con un
elemento de interfaz de usuario visible. De hecho, PopupMenus por lo general se
aparecieron a partir de un rea de trabajo o de otra regin que no est afiliado con
un componente de interfaz de usuario como un pulsador o CascadeButton.El
nico inconveniente de este diseo es que no hay ninguna indicacin para el
usuario principiante que existe el men. La figura muestra una PopupMenu.
Un PopupMenu
un OptionMenu
El uso del tercer botn del ratn para activar PopupMenus est en agudo
contraste con PulldownMenus y OptionMenus, que siempre son invocados por el
primer botn del ratn. Puede parecer confuso para el usuario que algunos mens
son invocados por el primer botn, mientras que otros son invocados por el
tercero. Sin embargo, hay una cierta coherencia en el hecho de que
PulldownMenus y OptionMenus siempre estn asociadas a CascadeButtons, y los
botones siempre se activan por el primer botn del ratn. Al precisar que
PopupMenus utilizar el tercer botn del ratn, el primer botn del ratn es libre
de ser usado para otras actividades en un rea de trabajo de aplicacin, lo cual es
importante ya que PopupMenus puede estallar en cualquier parte de una
aplicacin.
Cuando el usuario publica un men, slo se muestra hasta que el usuario realiza
una seleccin, y luego se retira. En Motif 1.2, el men puede tener una funcin
adicional que permite que pueda ser arrancado, para que as permanezca ha
escrito en su propia ventana. La funcionalidad de corte se activa mediante un
botn especial de corte en el men. El botn muestra una lnea discontinua para
indicar que se puede arrancar el men, como se rompiese un cupn de un
peridico. Cuando el usuario pulsa el botn de corte, el men se coloca en una
ventana separada, y el usuario puede hacer tantas selecciones como le
gustara. La figura muestra una PulldownMenu que proporciona la capacidad de
corte.
* /
# include <Xm / RowColumn.h>
# include <Xm / MainW.h>
# include <Xm / DrawingA.h>
principal (argc, argv)
int argc;
char * argv [];
{
XmString lnea, cuadrado, crculo, salida, exit_acc;
Widget de nivel superior, main_w, drawing_a, popup_menu;
popup_cb void (), entrada ();
XtAppContext aplicacin;
Funcin XtSetLanguageProc (NULL, NULL, NULL);
toplevel = XtVaAppInitialize (y de aplicaciones, "Demos", NULL, 0,
Y argc, argv, NULL, NULL);
/ * Crear un widget MainWindow que contiene un DrawingArea en
* Su ventana de trabajo.
* /
main_w = XtVaCreateManagedWidget ( "main_w",
xmMainWindowWidgetClass, de nivel superior,
XmNscrollingPolicy, XmAUTOMATIC,
NULO);
/ * Crear un rea de Dibujo - dibujo real no se llevar a cabo.
* /
La produccin de simple_popup.c
El kit de herramientas Motif no se ocupa de la publicacin de un PopupMenu de
forma automtica, como lo hace con PulldownMenus y OptionMenus, por lo que
debemos vigilar los eventos apropiados nosotros mismos. Usamos
el XmNinputCallback recursos del control DrawingArea para seguir los
acontecimientos, ya que la rutina es llamada cuando una accin de teclado o el
ratn pasa en el widget. En una aplicacin real, usaramos esta rutina para
manejar dibujo tambin. Sin embargo, en este caso, la entrada () rutina slo
busca ButtonPress eventos para el tercer botn del ratn. El men se pasa como
los datos de los clientes a la entrada () .
Si de entrada () ve un evento apropiado, utiliza el XmMenuPosition () rutina
para situar el men en las coordenadas especificadas en el caso de la estructura
de datos. El men se extrae a continuacin utilizando XtManageChild () . En lo
que se refiere a Xt, este mtodo para hacer estallar un men es tcnicamente
incorrecta. Se apoya en el kit de herramientas Motif para simplificar la interfaz
PopupMenu.Para obtener ms informacin, consulte la discusin sobre
apareciendo cuadros de dilogo en el captulo 5, Introduccin a los cuadros de
dilogo . El men contiene cuatro artculos, el ltimo de los cuales tiene el
acelerador Ctrl <clave> C . Cada vez que el usuario presiona CTRL-C en la
aplicacin, la rutina de devolucin de llamada asociado con el men se llama
como si el men se haba aparecido y lasalida tema haba sido
seleccionada. El popup_cb () de rutina o bien imprime el nombre del elemento de
men o sale, segn el elemento que ha seleccionado el usuario. Tenga en cuenta
que el nombre del elemento de men no se corresponde con su etiqueta. Como se
describe en el Captulo 4, La ventana principal , elementos de men se le asigna
La produccin de simple_pullright.c
* Mostrar un
dibujo de
* El men de
* /
# include <Xm
# include <Xm
# include <Xm
# include <Xm
# include <Xm
RowColumn.h>
MainW.h>
ScrolledW.h>
DrawingA.h>
PushB.h>
PB;
XtManageChild (option_menu);
/ * Crear un DrawingArea dentro de un ScrolledWindow * /
sw = XtVaCreateManagedWidget ( "SW",
xmScrolledWindowWidgetClass, rc,
XmNscrollingPolicy, XmAUTOMATIC,
NULO);
drawing_a = XtVaCreateManagedWidget ( "drawing_area",
xmDrawingAreaWidgetClass, sw,
XmNwidth, 500,
XmNheight, 500,
NULO);
XtManageChild (RC);
XtRealizeWidget (nivel superior);
XtAppMainLoop (app);
}
la
La produccin de simple_option.c
()
()
El cdigo sigue los pasos que acabamos de exponer. La barra de men se crea
como un hijo de la MainWindow, y el PulldownMenu se crea como un hijo de la
barra de men. El CascadeButton acta como elArchivo elemento ttulo en la
barra de men, por lo que tambin se crea como el nio de la barra de
men. Tanto el ttulo del men y la PulldownMenu son hijos de la barra de
La produccin de file_menu.c
XmNmnemonic, 'X',
NULO);
Si bien este mtodo lleva a cabo la tarea, un problema con esto es que la tecla de
acceso est codificada en el widget, mientras que la etiqueta no lo es. Considere
la siguiente especificacin de recursos en un archivo de recursos:
* Exit.labelString: Quit
Este recurso define la etiqueta para el botn de elemento en "Salir", pero desde el
mnemnico para el botn no es modificable a "x", hay una retroalimentacin
visual, y la tecla de acceso en s es contrario a la intuicin.
La mejor manera de manejar esta situacin es especificar tanto la cadena de la
etiqueta y la tecla de acceso en el mismo lugar: un archivo de recursos o cdigo
de la aplicacin. Por ejemplo:
* Exit.labelString: Salir
* Exit.mnemonic: x
Ajuste de los dos de estos recursos de la misma manera ayuda a garantizar que
una aplicacin tiene una interfaz consistente.
16.3.4 Aceleradores
El propsito de los aceleradores de men es proporcionar al usuario la capacidad
de activar elementos de men en un PulldownMenu sin tener que visualizar el
men en absoluto. En la Figura 15-1, la Quitelemento de men muestra el
acelerador Ctrl + C para indicar que el usuario puede pulsar la secuencia de
teclas CTRL-C para activar ese elemento de men y salir de la aplicacin.
Para instalar un acelerador en un elemento de men, utilice el XmNaccelerator de
recursos para especificar la traduccin del acelerador y XmNacceleratorText para
proporcionar informacin visual al usuario.Un efecto secundario de la aplicacin
de aceleradores motivo es que no se puede instalar sus propios aceleradores
utilizando los mtodos estndar proporcionados por el kit de herramientas
intrnseco X (comoXtInstallAccelerators () o XtInstallAllAccelerators
() ). Estas funciones no funcionarn, y que pueden interferir con el mecanismo
del acelerador del adorno al tratar de usarlos. Estos recursos son definidos por la
clase de etiqueta, pero slo funcionan para los pulsadores y ToggleButtons en
mens. La sintaxis para el acelerador es exactamente el mismo que el de una
tabla de traduccin, excepto que no se especifica una funcin de accin con la
secuencia de eventos. El acelerador para la Quit botn en la figura 15-1 se
especifica como "Ctrl <clave> C" . (Para obtener informacin sobre cmo
Creacin de una Ayuda men es igual que la creacin de cualquier otro men,
excepto que una vez que se haya creado el CascadeButton, se debe configurar
el XmNmenuHelpWidget recurso para la barra de men. Este recurso especifica qu
CascadeButton se coloca en el extremo derecho de la barra de men, que es
donde el Libro de estilo establece que la Ayuda de men tiene que ser
colocado. el cdigo fuente contiene una rutina que muestra cmo crear
un Ayuda men y adjuntarlo a la barra de men. En este ejemplo, se presenta un
enfoque alternativo para la creacin de ttulos barra de mens y su
PulldownMenus asociado.
vaco
BuildHelpMenu (MenuBar)
BarraDeMens Widget;
{
Widget HelpPullDown, flash;
int i;
char * h_items estticas [] = {
"En Contexto", NULL, "En Ayuda", "En Ventana", "en claves",
"ndice", "Tutorial", "En la versin"
};
/ * * Men de Ayuda /
Gran parte del trabajo necesario para crear un PulldownMenu est involucrado en
la creacin de los elementos del men. Podemos optimizar el cdigo mediante el
uso de un bucle que crea los elementos individuales en base a los nombres
indicados en una matriz esttica. Si desea aadir un nuevo elemento de ayuda a la
lista, slo tiene que aadir su nombre a la h_items lista. Un NULL entrada hace que
un aparato separador que se aade al men. En el cdigo fuente se especifica la
misma funcin de devolucin de llamada para cada elemento en el
men; la client_data es el mismo que el nombre del elemento de men. En la
seccin #smenucreate, ampliamos en este enfoque para construir mens
arbitrarios para la barra de men.
16.3.6 Sensibilidad
Como hemos mencionado anteriormente, ttulos barra de mens y elementos de
men no deben ser creadas o destruidas de forma dinmica. Pueden, sin embargo,
pueden activar o desactivar el uso de XtSetSensitive () . Cuando un
CascadeButton o un elemento de men es insensible , que est en gris, y el
usuario no es capaz de mostrar el men asociado o activar el elemento de men.
Para CascadeButtons, la insensibilidad tiene el efecto adicional de prevenir que el
usuario pueda acceder a cualquiera de los elementos en el men asociado,
incluido el acceso a travs de la mnemotcnica y aceleradores, ya que el men no
se puede visualizar. El men y todos sus artculos son completamente disponible
hasta que la sensibilidad de la CascadeButton se pone a cero. Un mtodo
Ahora vamos a decir que esta aplicacin se vuelve a compilar con Motif 1.2. Si el
convertidor de recurso para XmNtearOffModel se han instalado, el usuario puede
habilitar la funcionalidad de corte, y que podra causar que la aplicacin no
funcione correctamente. Si una aplicacin necesita para realizar un seguimiento
de las idas y venidas de los mens, lo que tiene que hacer trabajo extra para los
mens de corte. Puesto que el convertidor no est instalado de forma
predeterminada, el programador puede decidir si desea o no admite la
funcionalidad de corte en este caso. Si la aplicacin se modifica para apoyar a los
mens de corte, entonces se puede instalar el convertidor y permitir al usuario
configurar el recurso en un archivo de recursos. Si su aplicacin no requiere
ningn tratamiento especial de mens, no hay ninguna razn para no permitir la
funcionalidad de corte para todos los mens, ya que realmente es una comodidad
para el usuario.
El widget RowColumn ofrece dos nuevos recursos de devolucin de llamada que
permiten una aplicacin para realizar un seguimiento de los mens de
corte. El XmNtearOffMenuActivateCallback rutina es llamada cuando un men est
arrancada; XmNtearOffMenuDeactivateCallback se llama cuando se desestim el
men arrancada. Estas devoluciones de llamada proporcionan una forma para
llevar a cabo ningn proceso especial que es necesaria para el manejo de mens
de corte.
Motif tambin proporciona acceso al botn de corte con el XmGetTearOffControl
() de rutina. Esta rutina toma un panel de men y devuelve el identificador de
artefacto que el botn de corte en el men, si es que existe. De lo contrario, la
rutina retorna NULL . El botn de corte tiene un aspecto similar al
separador; puede especificar su fondo, el frente y la parte superior e inferior de la
sombra colores utilizando los recursos estndar, as como
la XmNseparatorType recursos. Tambin puede configurar estos recursos en un
archivo de recursos utilizando el nombre del botn, que es TearOffControl .
aplicacin. Aunque utilizamos los valores codificados de forma rgida por los
recursos de widgets, esta tcnica es de ninguna manera un requisito, ni debe ser
interpretado como uso recomendado.Si se elige especificar los recursos en un
archivo de recursos, debe escribir un archivo por defecto de la aplicacin que
contiene los valores de los recursos apropiados.
16.4.1 Construccin desplegable mens
Vamos a comenzar por la identificacin de cada uno de los atributos de un
elemento de men:
Etiqueta
Mnemotcnico
acelerador
acelerador de texto
rutina de devolucin de llamada
los datos de devolucin de llamada
Con esta informacin, podemos construir una estructura de datos que describe
todos los aspectos importantes de un elemento de men. Definimos
el MenuItem estructura como sigue:
_menu_item typedef struct {
char * etiqueta; / * La etiqueta del elemento * /
clase WidgetClass *; / * Pulsador, etiqueta, separador, ... * /
charlas mnemotcnica; / * Mnemotcnica; NULL si ninguno * /
char * acelerador; / * Acelerador; NULL si ninguno * /
char * accel_text; / * Se convierte en el compuesto cadena * /
void (* devolucin de llamada) (); / * Para llamar a la rutina;
NULL si ninguno * /
callback_data XtPointer; / * Client_data de devolucin de llamada
() * /
} Opcin del men;
Para crear un PulldownMenu, todo lo que tenemos que hacer es inicializar una
matriz de MenuItem estructuras y pasarlo a una rutina que itera a travs de la
matriz y crea los elementos usando la informacin apropiada. Por ejemplo, la
siguiente declaracin describe los elementos de un archivo de men:
Menultem file_items [] = {
{ "Nuevo", y xmPushButtonGadgetClass, 'N',
NULL, NULL, do_open, NEW},
Widget
CreateMenuBar (MainWindow)
MainWindow Widget;
{
Widget BarraDeMens, flash, BuildPulldownMenu ();
BarraDeMens = XmCreateMenuBar (MainWindow, "BarraDeMens", NULL,
0);
(void) BuildPulldownMenu (barra de men, "File", "F", es cierto,
file_items);
Cada llamada a BuildPulldownMenu () pasa un vector de preinicializado MenuItem estructuras. La Ayuda men es un caso especial, por lo que
establece la XmNmenuHelpWidget de recursos para que el BarraDeMens s a qu
elemento se trata. Al establecer el recurso a la CascadeButton devuelto por la
funcin, la BarraDeMens sabe que este botn se debe colocar en el extremo
derecho. El nico parmetro a la CreateMenuBar () la funcin es el control
MainWindow que es el padre de la BarraDeMens que se devuelve.
16.4.2 Construccin Mens en cascada
Podemos aadir mens pullright a nuestra metodologa de creacin de mens con
bastante facilidad mediante la adicin a la MenuItem estructura de datos y hacer
una ligera modificacin a laCreatePulldownMenu () funcin. Como hemos
aprendido de las simples rutinas de creacin de men, un men en cascada es
realmente un PulldownMenu que se asocia con un CascadeButton. Tambin
sabemos que podemos adjuntar un men a una CascadeButton estableciendo
el XmNsubMenuId recurso a la manija de la PulldownMenu. Comenzamos por la
modificacin del Menultem estructura de la siguiente manera:
_menu_item typedef struct {
char * etiqueta; / * La etiqueta del elemento * /
clase WidgetClass *; / * Pulsador, etiqueta, separador ... * /
charlas mnemotcnica; / * Mnemotcnica; NULL si ninguno * /
char * acelerador; / * Acelerador; NULL si ninguno * /
char * accel_text; / * Se convierte en el compuesto cadena * /
void (* devolucin de llamada) (); / * Para llamar a la rutina;
NULL si ninguno * /
callback_data XtPointer; / * Client_data de devolucin de llamada
() * /
_menu_item struct * subpuntos; / * Elementos de men pullright, si
no es NULL * /
} Opcin del men;
NULL);
XmNvalueChangedCallback: / * * clase
ToggleButton /
.callback_data);
}
cascada de retorno;
}
vaco
set_dot_dash (widgets, client_data, call_data)
smbolo grfico;
client_data XtPointer;
call_data XtPointer;
{
int dot_or_dash = (int) client_data;
printf ( "Ajuste de estilo de lnea de% S0, dot_or_dash?" punto
":" guin ");
}
Menultem weight_menu [] = {
{ "1", y xmPushButtonGadgetClass, '1', NULL, NULL,
set_weight, (XtPointer) 1, (Menultem *) NULL},
{ "2", y xmPushButtonGadgetClass, '2', NULL, NULL,
set_weight, (XtPointer) 2, (Menultem *) NULL},
{ "3", y xmPushButtonGadgetClass, '3', NULL, NULL,
set_weight, (XtPointer) 3, (Menultem *) NULL},
{ "4", y xmPushButtonGadgetClass, '4', NULL, NULL,
set_weight, (XtPointer) 4, (Menultem *) NULL},
NULO,
};
Menultem color_menu [] = {
La produccin de build_menu.c
Todo lo que tenemos que hacer para conseguir BuildPulldownMenu () para crear
un men en cascada es aadir cdigo que comprueba si el men actual tiene un
submen. Si lo hace, la rutina llama a s misma para crear el submen. Debido a
que la funcin crea y devuelve un CascadeButton, el valor de retorno se puede
utilizar como el elemento de men en el men que se est construyendo
actualmente. Tenemos que crear el men en cascada en primer lugar porque tiene
que existir antes de que se pueda asociar a un CascadeButton. La recursividad se
ocupa de este problema para nosotros mediante la creacin de los submens ms
profundo en primer lugar, lo que asegura que todos los submens necesarios
estn construidos antes de que sus CascadeButtons ellos requieren.
NULL);
XmNlabelString, str,
XmNmnemonic, menu_mnemonic,
NULO);
XmStringFree (str);
}
volver menu_type == XmMENU_POPUP? Men: cascada;
NULL},
+ C",
un men
* de aqu!
* /
= botn XtVaCreateManagedWidget ( "Botn 1",
xmPushButtonGadgetClass, Fila Col, NULL);
XtAddCallback (botn, XmNactivateCallback, put_string, "Botn 1");
por lo
* /
La produccin de popups.c
El programa muestra dos pulsadores, uno de los cuales es un gadget y el otro un
widget. Obtenemos el ButtonPress caso preguntando especficamente para l
usando XtAddEventHandler () . Esta rutina requiere un widget porque necesita
una ventana. Para agregar un controlador de eventos para un dispositivo, que
tendra que instalarlo en el padre del dispositivo, el cual es un widget
gerente. Cada vez que unButtonPress evento se produce en el administrador, el
controlador de eventos se llama, por lo que el controlador de eventos tendra que
comprobar las coordenadas del evento y ver si ocurri dentro de los lmites del
gadget. Esta tcnica funciona, pero est ms all del alcance de esta simple
demostracin.
XtAddEventHandler ()
que aparezca el men, hay que posicionar el men y luego administrar el panel de
men. Para colocarlo, utilizamos XmMenuPosition () , que toma la forma
siguiente:
vaco
XmMenuPosition ( Reproductor , evento )
Widget widget de ;
* XButtonPressedEvent evento ;
XmNvalueChangedCallback: / * * clase
ToggleButton /
.callback_data);
}
geom.request_mode = CWHeight;
XtQueryGeometry (option_menu, NULL, y geom);
XtVaSetValues (option_menu,
XmNpaneMinimum, geom.height,
XmNpaneMaximum, geom.height,
NULO);
/ * La ventana de desplazamiento (que contiene el rea de
es un nio
* De la PanedWindow; su hermano, el men de opciones, no
cambiar el tamao,
* Por lo que si el usuario cambia el tamao de la concha
superior, esta * * ventana cambiar de tamao.
* /
sw = XtVaCreateManagedWidget ( "SW",
xmScrolledWindowWidgetClass, panel,
XmNscrollingPolicy, XmAUTOMATIC,
NULO);
/ * Crear un rea de Dibujo - dibujo real no se llevar a
* /
drawing_a = XtVaCreateManagedWidget ( "drawing_a",
xmDrawingAreaWidgetClass, sw,
XmNwidth, 500,
XmNheight, 500,
NULO);
dibujo)
se puede
de nivel
cabo.
XtManageChild (panel);
XtRealizeWidget (nivel superior);
XtAppMainLoop (app);
}
16.5 Resumen
Los mens son bsicamente objetos simples que proporcionan al usuario el
acceso a la funcionalidad de la aplicacin. Mientras que las simples rutinas de
creacin de men son muy tiles para la creacin de un prototipo bsico y otras
construcciones de aplicaciones simples, su utilidad es limitada una vez que
comience a desarrollar aplicaciones a gran escala.
Hemos descrito el diseo de una rutina de creacin de men general, por lo que
debe quedar claro que slo se necesitan dos cosas para crear un nmero arbitrario
de mens: arrays predefinidos de MenuItemestructuras y la BuildMenu
() funcin. Ya que la inicializacin de una matriz MenuItem objetos es muy
sencillo, nuestro mtodo es conveniente y tambin ms potente que las simples
rutinas de creacin de men. Hemos definido nuestro propio tipo de datos y
generalizada la rutina para crear mens para que pueda utilizar y modificar estas
funciones como usted quiera, para ajustarse a las necesidades de su aplicacin.
16.6 Ejercicios
En este captulo se podra seguir para siempre discutiendo ms y ms cosas que
puede hacer con los mens. Sin embargo, el objetivo era presentar con los
conceptos fundamentales y las consideraciones de diseo detrs de los mens. A
partir de esta informacin, usted debe ser capaz de aprender por su cuenta nuevas
tcnicas que no hemos abordado al. En ese espritu, debe ser capaz de hacer los
siguientes ejercicios basado en el material tratado en este captulo.
Crear un widget MainWindow que tiene una barra de men que contenga
al menos el Archivo , Editar y Ayuda mens, un OptionMenu, y un
PopupMenu que aparece a partir de un control DrawingArea. En primer
lugar poner en prctica los mens usando las simples rutinas de creacin
de men y, a continuacin, ponerlas en prctica mediante el BuildMenu
() funcin.