Вы находитесь на странице: 1из 14

DNDE EST EL MEN ARCHIVO?

La primera vez que abr Microsoft Office 2007 que experiment el factor sorpresa que
Microsoft estaba promoviendo la liberacin de Vista. Poco despus de que pens, me
pregunto si podemos hacer esto en Visual FoxPro? Bueno adivinen qu, parece que pueda.
Este documento describir la manera nueva interfaz de men radical e innovador de
Microsoft Office se puede utilizar dentro de una aplicacin de Visual FoxPro, el nico requisito
es que se ejecuta bajo VFP 9 ya que este cdigo hace uso de de Windows Mensaje de
sucesos de unin y esta caracterstica no exista en las versiones anteriores de la lengua que no sean que el cdigo utiliza el estndar VFP, no hay controles ActiveX, DLL, no hay
ningn FLLS, nada ms que VFP ncleo y algunas llamadas a la API bsicas.

Figure 1: Microsoft Office 2007 Word Menu

Como se puede ver el nuevo sistema de mens de Office es una desviacin importante de lo
que hemos estado acostumbrados a ver desde hace muchos aos. Se acab la barra de
mens, las barras de herramientas son ido, ido es el men Archivo. En cambio, lo que nos
queda es una mancha en busca hbrido de los dos con un gran botn circular simplemente
pidiendo ser empujado; incluso la santidad de la barra de ttulo se ha reclutado al servicio
activo.
Se necesita un poco de tiempo para acostumbrarse, pero una vez que la confusin inicial se
convierte en curiosidad me encontr con que la nueva interfaz fue una muy buena manera
de presentar opciones a un usuario. Despus de todo, una barra de herramientas era slo un
acceso directo a una opcin de men, as que por qu no combinar los dos conceptos en
uno - pidiendo mucho ms visual - interfaz.

LOS COMPONENTES DE OFFICE


Lo primero que tenemos que hacer es romper la interfaz del men en sus partes
componentes. Tenga en cuenta que estoy haciendo estos nombres, pero yo tena que
llamarlos algo que yo pudiera hacer que las clases que necesitaba, as que no se ofenda si he
mal llamada un widget - el error (si lo hay) es enteramente mo.

Figure 2: Office Word Menu Components

La imagen de arriba muestra los diversos componentes y la lista a continuacin describe su


propsito en la interfaz de VFP equivalente.
Nombre
Componente
Start Item

Descripcin
Este componente contiene los artculos que solan encontrarse en el men

Quick Bar

Menu Tab
Popup
Hotkey
Help Item

Archivo, as como las opciones de men adicionales que el usuario pueda


necesitar para interactuar con la aplicacin.
Este componente es muy similar a las barras de herramientas que todos
estamos acostumbrados. Proporciona un acceso directo a las acciones de uso
comn.
Esta es una coleccin de controles que las funciones de usuario de grupo
regular.
Este componente es un sub-grupo de opciones dentro de una pestaa de
men.
Este pequeo icono se hace visible cuando el usuario presiona la tecla ALT
para mostrar los atajos de teclado a las opciones del men.
El icono de men de ayuda de la aplicacin.

Control Box

La minimizar, maximizar y cerrar la caja de la interfaz. Dado que el nuevo


sistema de men ha reemplazado a la barra de ttulo forma estndar de esta
caja permite al usuario acceder a las funciones todava para apagar o
minimizar la aplicacin.
Adems de lo anterior hay un componente ms. La pantalla de abajo se visualiza cuando el
usuario presiona el artculo Inicio.

Figure 3: Start Item Popup Screen

Como se puede ver las opciones de almacenamiento e impresin de esta emergente se han
reproducido en la barra rpida pero las cosas a destacar es el botn Salir y el pasador en la
lista de documentos recientes.

LOS COMPONENTES DE FOXPRO


El principio que subyace detrs de un men es que las selecciones de men no deben de
ninguna manera interferir con el trabajo que el usuario est haciendo en la pantalla activa.
Por esta razn bsica de toda la interfaz de men con pestaas se ha contenido dentro de
una barra de herramientas de VFP, porque de acuerdo con la ayuda de VFP muchos controles
colocados en una barra de herramientas no lo hacen recibir el foco cuando se eligen. Ms all
de que todos los dems componentes se basan en el control contenedor y la forma (para el
inicio popup Elemento).
Debido a que la interfaz de men con pestaas est destinado a ser utilizado sin necesidad
de cambios en el cdigo directamente dentro de los componentes el desarrollador debe
interactuar con los componentes, haciendo uso de la funcin () BINDEVENTS. En BINDEVENTS
adicin () se utiliza para asegurar que el comportamiento men como se exhibe cuando el
usuario presiona las teclas de acceso rpido. Por lo tanto, a fin de utilizar el cdigo de los
mens debe ser colocado en cada una de las formas de la aplicacin para disponer que la
interaccin pero teniendo en cuenta la orientacin a objetos de VFP esto no debera ser
demasiado de una imposicin para un desarrollador para aceptar.
Los componentes para implementar el men est contenido dentro de la biblioteca de clases
tabmenu.vcx y el objetivo de diseo ha sido que no hay ningn requisito para un
desarrollador que desee hacer uso del men para cambiar ese cdigo. La siguiente tabla
muestra las clases y proporciona una breve descripcin de cada uno.

Class

Description

cntControl

La minimizar, maximizar y cerrar botones en la parte superior derecha de la


ventana.
El pequeo botn de signo de interrogacin en la parte derecha de la banda
de men.
Las fichas que componen el men.
Las opciones del men actual.
Un contenedor para los elementos emergentes muestra cuando se
selecciona una ficha de men particular.
La coleccin de opciones que se muestran a la izquierda de la barra de ttulo.
Los botones que aparecen en la barra rpida.
Un cuadro de texto aparece en la banda de men junto al elemento de
ayuda para proporcionar una bsqueda de texto dentro de la aplicacin.
El elemento del men principal aparece en la parte superior izquierda de la
banda de men.
El contenedor control que pone todos los diversos componentes juntos.
La pantalla del men emergente de inicio de base.
La barra de herramientas que contiene una instancia del contenedor
cntTabMenu.
La forma de popup men base, utilizado para proporcionar la funcionalidad
submen
La forma tabmenu base, tanto las otras formas heredan de esta forma.

cntHelpItem
cntMenuItem
cntPopupItem
cntPopupMenu
cntQuickBar
cntQuickItem
cntSearchBox
cntStartItem
cntTabMenu
frmStartMenu
tbrTabMenu
frmPopup
frmTabMenu

USO TAB MEN EN SU APLICACION


Antes de poder utilizar la herramienta TabMenu con el proyecto ejemplo favor asegrese de
que usted ha cambiado su programa _GENMENU a gentabmenu.prg. Esto es crucial para
asegurar que los atributos correctos se aaden a cualquiera de su formulario principal o en la
pantalla de VFP dependiendo de la forma en que su aplicacin est diseada para funcionar.
Sin hacer este paso el cdigo de men generado puede no compilar correctamente y sin
duda no funcionen con el men de la ficha.

THE TAB MENU EVENTS


El TabMenu expone su interfaz a travs de una serie de eventos. Esto se hace para que
pueda incluir fcilmente el TabMenu en sus aplicaciones sin la necesidad de subclase muchos

de sus componentes. La siguiente tabla muestra cada uno de estos eventos y da un breve
ejemplo para cuando se levantan esos eventos.

Event

Description

AppMinimize
AppMaximize
AppRestore

Se produce cuando se presiona el botn de minimizar por el usuario


Se produce cuando se presiona el botn de maximizar el usuario
Se produce cuando se presiona el botn de restauracin por parte del
usuario
Se produce cuando se presiona el botn de cierre por el usuario
Se produce cuando el usuario elige para minimizar la cinta
Se produce cuando el usuario elige para restaurar la cinta despus de que se
ha minimizado
Se produce cuando el usuario selecciona un elemento de men cuando se
minimiza la cinta
Se produce cuando el usuario mueve a otro elemento del men cuando se
minimiza la cinta
Se produce cuando cualquier elemento del men est seleccionado por el
usuario - planteada por cada artculo
Se produce cuando se visualiza un submen

AppExit
TbmMinimize
TbmRestore
TbmDropDown
TbmRollup
Execute
SubMenu

EJEMPLO PRCTICO
Me parece que la mejor manera de explicar cmo funciona algo es ir a travs de un ejemplo
prctico. Los ejemplos en este documento son, evidentemente, muy trivial y sin duda no
intentan representar el desarrollo de aplicaciones del mundo real lo han tomado atajos para
agilizar la solucin.
En el programa principal de un proyecto VFP asegurarse de que la biblioteca de clases
tabmenu est disponible y que la ruta de los archivos de imagen est ajustado. Debido a que
el men est contenido dentro de un control de barra de herramientas de la aplicacin debe
tener un formulario de nivel superior - ya que la pantalla de VFP o alguna otra forma de VFP.
En este ejemplo vamos a crear un formulario VFP con las siguientes propiedades y crear el
objeto de formulario en el programa principal del proyecto.
Property
Value
BorderStyle
0 no border
ShowWindow
2 As top level form
TitleBar
0 Of
oToolbar
.null.
Los siguientes mtodos se deben crear o anulados como se muestra:
Method

Code

Activate

Application.Visible = .f.
IF VARTYPE(thisform.oToolbar) = "O"
thisform.oToolbar.Refresh()
ENDIF
UNBINDEVENTS(this.HWnd)
Application.Visible = .t.
CLEAR EVENTS
thisform.Width = SYSMETRIC(1) + 30
thisform.Left = -15
thisform.Top = 0 - (SYSMETRIC(9) + 5)
DECLARE INTEGER GetWindowLong IN Win32API INTEGER hWnd, INTEGER nIndex
#define GWL_WNDPROC
(-4)
this.nOldProc = GetWindowLong(this.Hwnd, GWL_WNDPROC)
(empty for now)
thisform.WindowState = 1
CLEAR EVENTS
thisform.Release()

Destroy
Init

TabMenuHandler
AppMinimize
AppExit

El mtodo TabMenuHandler () se utiliza para incluir el cdigo que se ejecuta cuando se


seleccionan las opciones del men. En este programa de ejemplo todas las opciones del

men sern manejados por este mtodo, pero, obviamente, esto se puede hacer de manera
diferente para cada aplicacin. Usted podra tener un controlador de eventos personalizado
para cada opcin de men si se quiere, todo est impulsado por la funcionalidad de unin
evento en VFP (ms sobre esto ms adelante).
En el programa principal se crea el formulario de nivel superior y se asigna a una variable
pblica, si est utilizando la pantalla de VFP usted no necesita preocuparse porque esa
variable _SCREEN ya es pblica. La razn de la variable pblica es porque hay que ser capaz
de llegar a la barra de herramientas de cada una de sus formas y para los fines de este
ejemplo una variable pblica es la ms fcil. Una vez creado el formulario y hace visible se
crea la barra de herramientas y se une a una propiedad en el formulario.
El cdigo en el Init () de la forma existe para ocultar la barra de ttulo de la ventana y las
fronteras normal porque el men de la ficha opcionalmente puede aadir su propia barra de
ttulo. Tambin almacena el nmero de procesos de Windows para la forma que necesitamos
para algunos de los eventos de unin porque para que la caja de control de la barra de
herramientas para funcionar como esperbamos tenemos que obligar a los eventos de las
ventanas como se muestra aqu:
#define WM_ACTIVATEAPP

0x001C

BINDEVENT(goForm.Hwnd, WM_ACTIVATEAPP, goForm.oToolbar.cnttabmenu,


"WMEventHandler")
Desde aqu tienen algunas propiedades que se fij en la barra de herramientas y entonces
usted puede comenzar a agregar los componentes del men. La barra de herramientas debe
ser acoplada en la parte superior del formulario, yo voy a establecer el ttulo de la barra de
ttulo falso de la barra de herramientas y yo voy a hacer que la altura de la forma igual a la
de la barra de herramientas, ya que en este ejemplo aparecen las formas de interfaz de
usuario en el escritorio de Windows.
goForm.oToolbar.cnttabmenu.nOldProc = goForm.nOldProc
goForm.oToolbar.cnttabmenu.cCaption = "Visual FoxPro User Interface Test"
goForm.oToolbar.Dock(0,0,0)
goForm.oToolbar.cnttabmenu.Width = goForm.Width - 30
goForm.Height = goForm.oToolbar.Height
Tambin queremos que la principal forma de procesar el minimizar y eventos cercanos
plantearon cuando el usuario hace clic en la caja de control y esto se hace a travs de la
funcin BINDEVENT () como se muestra aqu.
Voy a suponer que queremos el men de la ficha para incluir cada uno de sus componentes
opcionales, as que con esto en mente continuemos discutiendo cada componente y cmo
agregar sus propios elementos al men.

LA BARRA RPIDA
La barra rpida aparece en la esquina superior izquierda de la barra de ttulo. Slo puede
hacerse visible si la barra de herramientas est mostrando la barra de ttulo. Los elementos
de la barra rpidas se limitan a 21x21 pixels en tamao y no muestran ningn texto; aunque
un texto de ayuda est disponible, las teclas de acceso rpido se asignan automticamente
como nmeros de 1 a n en funcin del orden en que se aaden los artculos. Esto se hace
llamando a un mtodo en la barra de herramientas y luego establecer algunas propiedades
en el objeto devuelto. En vez de seguir hablando, aqu est el cdigo:
goForm.oToolbar.cnttabmenu.lShowQuickBar = .t.

loItem = goForm.oToolbar.cnttabmenu.cntQuickBar.AddItem("new.bmp")
loItem.cItemKey = "QUICK.OPTION1"
loItem.ToolTipText = "Tool tip for option 1"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = goForm.oToolbar.cnttabmenu.cntQuickBar.AddItem("edit.bmp")
loItem.cItemKey = "QUICK.OPTION2"
loItem.ToolTipText = "Tool tip for option 2"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
La primera lnea le dice a la barra de herramientas que la barra rpida es visible, los
prximos dos bloques de cdigo aaden dos elementos a la barra rpida y establece su llave
elemento y define la punta de la herramienta para mostrar. Los elementos de la barra Quick
tienen un evento llamado Ejecutar que se eleva cuando la opcin es seleccionada por el
usuario y el BINDEVENT () las llamadas que nos permite aadimos nuestro propio cdigo para
esos eventos.

LOS ELEMENTOS DEL MEN


Los elementos de men se aaden junto stos aparecen por debajo de la barra de ttulo y se
cambiar automticamente el tamao para adaptarse a su leyenda. Las teclas de acceso
rpido para las fichas de men se definen por el desarrollador como son las condiciones que
se utilizan para determinar si la pestaa del men est activo o inactivo (este ltimo aspecto
es cierto para todos los componentes del men pestaa). El cdigo necesario para aadir las
fichas de men se muestra aqu:
loMenu = goForm.oToolbar.cnttabmenu.Addmenuitem("Home","H")
loMenu = goForm.oToolbar.cnttabmenu.Addmenuitem("Programs","P")
loMenu = goForm.oToolbar.cnttabmenu.Addmenuitem("Reports","R")
El cdigo anterior se sumar tres pestaas del men de la barra de herramientas con los
subttulos, Inicio, Programas e Informes y teclas de acceso rpido, H, P y R, respectivamente.
No hay ningn requisito para unirse a un evento aqu ya que el propsito de las pestaas del
men es para mostrar las ventanas emergentes que aparecen por debajo de ellos.

EL POP-UPS
Las ventanas emergentes se utilizan para agrupar las opciones del men pestaa reales, se
trata de las entraas de lo que estamos tratando de lograr una forma para que los usuarios
de su sistema para interactuar con el sistema de mens. S que tcnicamente estas opciones
de men no aparezcan, pero el trmino se deriva de lo que estaban tratando de reemplazar los mens reales.
Una ventana emergente se aade primero y luego los elementos emergentes se agregan a la
ventana emergente. Un emergente tiene una leyenda que describa los controles contenidos
en ella y se une a una pestaa del men especial, el desarrollador tambin puede especificar
el nmero de columnas que quieren que su emergente para consisten y la anchura de la
ventana emergente (entre otras cosas). El cdigo para agregar una ventana emergente se
muestra aqu:
loPopup = goForm.oToolbar.cnttabmenu.AddPopup("Home #1", 1)
loPopup.nColumns = 3
loPopup.Width = (loPopup.nColumns * 100)
En el ejemplo anterior una ventana emergente llamada Home # 1 se aade a la primera ficha
de men. Se define con 3 columnas y cada columna es de 100 pxeles de ancho. La decisin
sobre el nmero de columnas y el ancho de cada columna es arbitraria como el men de la
ficha se ajustar automticamente el tamao de los elementos emergentes para que quepa
en la ventana emergente que pertenecen.

LOS ITEMS DEL POPUP


Una vez que el popup se crea la ventana emergente artculos necesitan ser aadido. Esto se
hace llamando al mtodo AddPopupItem () en el objeto emergente devuelto por el AddPopup
() llame arriba. La convocatoria para aadir el popup acepta 3 parmetros, el primero es el
subttulo, el segundo el tamao de la ventana emergente y la tecla de acceso directo. Una
vez creado el elemento emergente el desarrollador es capaz de establecer otras propiedades
para definir la forma en que aparece el elemento emergente. Al igual que con los elementos
rpidos de barras anteriores BINDEVENT () se utiliza para recibir el cdigo de desarrollador
para el acto del usuario de seleccionar una opcin emergente.
loItem = loPopup.AddPopupItem("Option 1", "NORM", "A")
loItem.cPicture = "New.bmp"
loItem.ToolTipText = "This is an example tool tip"
loItem.cItemKey = "HOME.OPTION1"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = loPopup.AddPopupItem("Option 2", "NORM", "B")
loItem.cPicture = "Edit.bmp"
loItem.cItemKey = "HOME.OPTION2"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = loPopup.AddPopupItem("Option 3", "NORM", "C")
loItem.cSkipForExp = "VARTYPE(_SCREEN.activeform)='O' AND
_SCREEN.Activeform.ShowWindow<>2"
loItem.cItemKey = "HOME.OPTION3"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = loPopup.AddPopupItem("Option 4", "NORM", "D")
loItem.cItemKey = "HOME.OPTION4"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = loPopup.AddPopupItem("Option 5", "NORM", "E")
loItem.cItemKey = "HOME.OPTION5"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
loItem = loPopup.AddPopupItem("Option 6", "NORM", "J")
loItem.cItemKey = "HOME.OPTION6"
BINDEVENT(loItem, "Execute", goForm, "TabMenuHandler")
El cdigo anterior se sumar seis elementos emergentes de la ventana emergente creada
antes de esto y fijar la tecla de acceso directo, imagen, punta de la herramienta y el estado
activo cuando sea pertinente. La propiedad cItemKey es opcional sino que proporciona una
manera de determinar qu objeto de men se selecciona por el usuario cuando el
procesamiento de los eventos. En este ejemplo vamos a utilizar esta clave para decidir qu
medidas tomar porque estoy obligatorias todas las opciones del men en el mismo
controlador de eventos.

EL ITEM DE INICIO
La parte final del men es el elemento de inicio. Este control no tiene mucho en el camino de
comportamiento por defecto que usted necesita para crear una subclase de la clase
frmstartmenu. La clase base en realidad no contiene ninguna funcionalidad que simplemente
proporciona el marco necesario para interactuar con el sistema de men de la ficha. Por lo

tanto, tendr que aadir su propio cdigo para esta subclase para que el popup men de
inicio hace nada. La primera cosa que usted necesita hacer es decirle al men de la ficha que
clase debe crear una instancia cuando se presiona el elemento de inicio. El cdigo siguiente
muestra cmo se puede hacer esto.
goForm.oToolbar.cnttabmenu.cfrmStartClass = "frmExampleStart"
Ahora que el men de la ficha sabe qu clase para crear tenemos que aadir cdigo para esa
clase para que haga algo. En este ejemplo, yo slo voy a aadir elementos emergentes a los
contenedores que existen en la clase base exactamente igual que lo hemos hecho ya en los
ejemplos de cdigo anterior.
Se aade este cdigo al Init () de la forma y se muestra aqu:
LPARAMETERS voTabMenu, vlShowHotKeys
IF DODEFAULT(voTabMenu, vlShowHotKeys)
LOCAL loItem
loItem = thisform.cntMenuItems.cntRecentItems.Addpopupitem("Recent Item 1", "NORM",
"1")
loItem.lShowPin = .t.
loItem = thisform.cntMenuItems.cntRecentItems.Addpopupitem("Recent Item 2", "NORM",
"2")
loItem.lShowPin = .t.
loItem = thisform.cntMenuItems.cntRecentItems.Addpopupitem("Recent Item 3", "NORM",
"3")
loItem.lShowPin = .t.
loItem = thisform.cntMenuItems.cntRecentItems.Addpopupitem("Recent Item 4", "NORM",
"4")
loItem.lShowPin = .t.
loItem = thisform.cntMenuItems.cntRecentItems.Addpopupitem("Recent Item 5", "NORM",
"5")
loItem.lShowPin = .t.
thisform.cntMenuItems.cntQuickMenu.Addpopupitem("Quick Menu 1", "LARGE", "A")
thisform.cntMenuItems.cntQuickMenu.Addpopupitem("Quick Menu 2", "LARGE", "B")
thisform.cntMenuItems.cntQuickMenu.Addpopupitem("Quick Menu 3", "LARGE", "C")
thisform.cntMenuItems.cntQuickMenu.Addpopupitem("Quick Menu 4", "LARGE", "D")
ELSE
RETURN .f.
ENDIF
Este cdigo se sumar cinco artculos al contenedor derecha y cuatro artculos al contenedor
a mano izquierda. Los elementos de la derecha incluyen un pasador visible y los artculos de
mano izquierda son grandes elementos emergentes. Esta forma ahora se muestra cuando el
usuario selecciona el elemento de inicio en el men.
Los contenedores en el formulario son los casos de los pop-ups usados en el men y, por
tanto, ofrecen todas las mismas funciones. Por lo tanto, a fin de adjuntar su propio cdigo
que se ejecutar cuando el usuario selecciona un elemento de esta pantalla es necesario
utilizar BINDEVENT () como se ha demostrado anteriormente.

LAS TECLAS RPIDAS


Ahora que hemos definido todos los mens, ventanas emergentes y elementos de la barra
rpida que necesitamos para permitir al usuario acceder a stas a travs de su teclado, as
como con el ratn. Por lo tanto necesitamos para unirse a un poco ms de los eventos de
Windows para asegurarse de que el men se comporta como se esperaba.
El cdigo para lograr esto se muestra a continuacin y debe ser colocado en el programa
principal y el Init () de los formularios utilizados dentro de su aplicacin.
#define WM_KEYDOWN
#define WM_KEYUP
#define WM_SYSKEYUP

0x0100
0x0101
0x0105

BINDEVENT(goForm.Hwnd, WM_KEYDOWN, goForm.oToolbar.cnttabmenu, "WMEventHandler")


BINDEVENT(goForm.Hwnd, WM_KEYUP, goForm.oToolbar.cnttabmenu, "WMEventHandler")
BINDEVENT(goForm.Hwnd, WM_SYSKEYUP, goForm.oToolbar.cnttabmenu, "WMEventHandler")

PROCESAMIENTO DE LAS ACCIONES DEL USUARIO


Ahora hemos terminado de definir el contenido del men de la ficha y todo lo que
necesitamos hacer es hacer lo que realmente hacer algo. Como puedes ver, hemos
consolidado todos los eventos de men con el mtodo TabMenuHandler () del formulario
principal, que hasta el momento hemos dejado en blanco. Este mtodo es donde se debe
colocar el cdigo para procesar las acciones del usuario. Para los fines de este ejemplo
coloque el cdigo siguiente dentro de ese mtodo:
PRIVATE paSource
AEVENTS(paSource, 0)
DO CASE
CASE VARTYPE(paSource[1].cItemKey) = "C" AND paSource[1].cItemKey = "HOME.OPTION1"
DO FORM testform
CASE VARTYPE(paSource[1].cItemKey) = "C" AND paSource[1].cItemKey = "HOME.OPTION2"
DO FORM testform2
CASE VARTYPE(paSource[1].cItemKey) = "C" AND paSource[1].cItemKey = "HOME.OPTION3"
IF VARTYPE(_screen.ActiveForm) = "O"
_screen.ActiveForm.Release()
ENDIF
OTHERWISE
MESSAGEBOX(paSource[1].name + " active form:" + ;
_screen.activeform.name + " " + ;
paSource[1].cItemKey, 4096, "Test")
ENDCASE
Method
Init

Code
#define WM_KEYDOWN
0x0100
#define WM_KEYUP
0x0101
#define WM_SYSKEYUP
0x0105
BINDEVENT(this.Hwnd, WM_KEYDOWN, goForm.oToolbar.cntTabmenu,
"WMEventHandler")
BINDEVENT(this.Hwnd, WM_KEYUP, goForm.oToolbar.cntTabmenu,

Activate

"WMEventHandler")
BINDEVENT(this.Hwnd, WM_SYSKEYUP, goForm.oToolbar.cntTabmenu,
"WMEventHandler")
goForm.oToolbar.Refresh()

LOS RESULTADOS
Una vez que toda la codificacin se ha hecho como se describe anteriormente se produce el
siguiente (ver abajo). Como se puede ver que no es exactamente lo mismo que los mens de
Office 2007, pero est bastante cerca.

Figure 4: The Visual FoxPro Tab Menu


Cuando se presiona el elemento de inicio se muestra lo siguiente:

Figure 5: Start Item Popup Screen

EL DISEADOR DE MENS FOXPRO


El ejemplo anterior requiere que el desarrollador de cdigo a mano el men y esto es algo
que los desarrolladores VFP no han tenido alguna vez que hacer. Pues lo mismo es cierto para
los mens de la ficha, puede seguir haciendo uso del diseador de mens VFP porque los
componentes del men ficha tambin incluyen un programa generador de men de la ficha
para convertir su men de VFP existente en los mens con pestaas que hemos estado
hablando.
En muchos casos no ser necesario realizar ningn cambio en absoluto a sus mens para
tomar ventaja de la nueva interfaz, pero si usted desea conseguir los mejores resultados
puede que tenga que alterar ligeramente los mens que ha construido. Pero antes de
empezar describiendo stos su tiempo para dar algunas advertencias.
El archivo tabmenugenerator.prg no entiende extensiones GenMenuX por lo que si usted ha
hecho un amplio uso de stos es posible que tenga un poco de trabajo adicional por hacer.
El generador no hace nada en absoluto para el popup elemento de inicio por lo que tendr
que codificar esto por separado.

Ahora que tenemos estas limitaciones fuera del camino vamos a empezar explicando cmo
se puede utilizar el diseador de mens. Para ello voy a empezar describiendo la manera de
crear el mismo men exacta como la que se muestra en el ejemplo de manual de arriba.
El programa principal - como antes - debe tener una ruta a los archivos de imagen y hacer
que la biblioteca de clases tabmenu.vcx disponibles, la diferencia sin embargo es una
llamada al archivo de men; en este ejemplo se llamar sample.mpr. Vamos a volver a
utilizar el formulario creado en el ejemplo anterior, por lo que el cdigo necesario en el
programa principal es bastante simple, de hecho, se muestra todo el programa principal aqu:
SET PATH TO u:\devsource\tabmenu\images\
SET CLASSLIB TO "tabmenu.vcx", "example.vcx"
RELEASE goForm
PUBLIC goForm AS Form
goForm = CREATEOBJECT("cfrmMain")
goForm.Caption = "Visual FoxPro User Interface Test"
goForm.Show()
DO sample.mpr
READ EVENTS
RELEASE goForm
A partir de aqu el trabajo restante se har mediante el men de Visual FoxPro diseador, por
supuesto, para que el cdigo de men de la ficha que se genere la ruta _GENMENU se debe
establecer en el archivo gentabmenu.prg.
Crear un nuevo men tal y como lo hara normalmente abrir el diseador de mens y aadir
tres submens al men principal; Inicio, Programas e Informes. Luego haga clic en las
opciones de cada uno de estos y establecer las propiedades como se muestra en la siguiente
tabla:
Menu Pad
Home

Property
Value
Shortcut Key Label
CTRL+H
Shortcut Key Text
H
Programs
Shortcut Key Label
CTRL+P
Shortcut Key Text
P
Reports
Shortcut Key Label
CTRL+R
Shortcut Key Text
R
Esto define las pestaas del men y ajusta la teclas de acceso rpido para la seleccin de
esas pestaas. La parte de la combinacin de teclas CTRL es ignorado por el generador, pero
debido a que el diseador de mens no admite caracteres de civil la tecla CTRL debe ser
utilizado.
Ahora tenemos que definir la ventana emergente para el men de inicio. En el ejemplo
anterior, tuvimos seis opciones contenidas en una ventana emergente con una leyenda de
Inicio # 1, vamos a duplicar esta usando el diseador de mens. Editar el submen Inicio y
agregar otro submen llamado Home # 1, esto se convierte en el ttulo emergente y nos
permite aadir cdigo para modificar la apariencia de esa emergente. Luego de editar ese
submen y agregar las opciones reales y el cdigo para personalizar la ventana emergente.
La informacin que necesita para aadir a cada una de las opciones del men se muestra
aqu:
Menu Item
Option 1

Option 2

Property
Shortcut Key
Shortcut Key
Picture File
Message
Command
Shortcut Key
Shortcut Key
Picture File
Command

Label
Text

Label
Text

Value
CTRL+A
A
New.bmp
This is an example tool tip
DO FORM testform
CTRL+B
B
Edit.bmp
DO FORM testform2

Option 3

Shortcut Key Label


Shortcut Key Text
Skip For
Procedure

Option 4
Option 5
Option 6

Shortcut
Shortcut
Shortcut
Shortcut
Shortcut
Shortcut

Key
Key
Key
Key
Key
Key

Label
Text
Label
Text
Label
Text

CTRL+C
C
NOT (TYPE('_SCREEN.activeform')='O' AND
_SCREEN.Activeform.ShowWindow<>2)
IF TYPE("_screen.ActiveForm") = "O"
_screen.ActiveForm.release()
ENDIF
CTRL+D
D
CTRL+E
E
CTRL+Q
Q

El siguiente cdigo se coloca en el fragmento de cdigo Home1 opciones de men:


loPopup.nColumns = 3
loPopup.Width = (100 * loPopup.nColumns)
Ahora que hemos terminado de definir las distintas partes slo tenemos que asegurarnos de
que la propiedad para definir el popup men de inicio est establecido y que la aplicacin
minimizar y eventos de salida estn obligados a la forma principal. Esto se hace en el cdigo
de configuracin del men, tal como se muestra aqu:
goForm.oToolbar.cnttabmenu.cfrmStartClass = "frmExampleStart"
goForm.Height = goForm.oToolbar.Height
BINDEVENT(goForm.oToolbar.cnttabmenu, "AppMinimize", goForm, "AppMinimize")
BINDEVENT(goForm.oToolbar.cnttabmenu, "AppExit", goForm, "AppExit")
Eso es todo lo que hay que hacer, ahora que acabamos de generar el cdigo y cuando nos
encontramos que los resultados deben aparecer exactamente igual que lo hicieron en el
ejemplo codificado mano por encima. Si usted echa un vistazo al cdigo generado se ver
que se ha hecho mucho, el controlador de eventos men ha sido definida como una clase y
luego una instancia de que se ha aadido al objeto _SCREEN al igual que el propio objeto de
men de la ficha.
Ciertamente utilizando el Diseador de mens toma gran parte del trabajo esclavo fuera del
diseo del men y nos proporciona una interfaz familiar para la construccin del men de la
ficha. Si bien es importante comprender la forma en que el men funciona bajo las sbanas si
desea ampliar su funcionalidad del programa tabmenugenerator ha sido escrito para permitir
que escribamos los mens y no tiene que preocuparse de cmo funcionan - en esencia, que
acaba de salir de nuestro camino como en los viejos mens hicieron.

EXTENSIONES DE MEN GENERADOR


El tab menu contiene una funcionalidad que no suele estar disponible para los estilos de
men ms tradicionales y como tal necesita el desarrollador para integrar la informacin en
los datos de men para que esta funcionalidad ampliada se puede utilizar. La barra rpida es
un ejemplo de esto.
Los elementos de la barra rpida tambin se definen en el nivel de men del sistema. Esto se
hace mediante la adicin de pastillas de comando o procedimiento y utilizar el nombre de la
almohadilla para definir el archivo de imagen de usar - como el diseador del men no
permite imgenes que se introduzcan en cuadros de men. Para el propsito de este ejemplo
vamos a aadir dos de tales entradas, New.bmp y Edit.bmp y definirlas como comandos,
como se muestra en la siguiente tabla.
Menu Pad
New.bmp

Property
Message

Edit.bmp

Message

Value
Tooltip for quick item
1
Tooltip for quick item

2
Una vez generado el men esto producir aadir los siguientes elementos a la barra de
acceso rpido.

Opciones del submen tambin son posibles. Hay dos estilos de submens, los que popup
opciones adicionales cuando se selecciona la opcin de men y las que dividen el comando,
que tienen dos acciones, una cuando se selecciona la opcin de men y otro cuando se
selecciona la flecha. En esta etapa el generador de men slo es capaz de proporcionar el
primer estilo de submen, es posible definir el segundo estilo, pero usted tendr que cdigo
de la mano de las acciones unidas al evento submen.
Con el fin de crear los submens, un submen se define exactamente como lo hara
normalmente la nica diferencia es que la opcin del men que se activa el submen debe
tener el \ + cuerda atada al indicador. Vamos a modificar el ejemplo anterior para que al
pulsar sobre la opcin 6 se mostrar un men emergente. Los datos para agregar al men se
muestra en la tabla aqu:
Menu Item
Option 6\+

Property
Shortcut Key Label
Shortcut Key Text
Submenu

Value
CTRL+Q
Q

Luego, en el submen de la opcin 6 aadir los siguientes elementos


Menu Item
Sub Option 1
Sub Option 2
Sub Option 3

Property
Shortcut Key
Shortcut Key
Picture File
Shortcut Key
Shortcut Key
Picture File
Shortcut Key
Shortcut Key

Label
Text
Label
Text
Label
Text

Value
CTRL+A
A
Edit.bmp
CTRL+B
B
New.bmp
CTRL+C
C

Una vez hecho esto y se genera el men obtendr los siguientes resultados:

Figure 6: Tab menu with submenu popup


Tambin puede agregar caracteres de signo de los submens para permitir que el men para
mostrar una marca junto a una opcin de men basado en una condicin particular. Esto se
realiza mediante la colocacin de una directiva generador de men en la etiqueta de
comentario de la opcin de men especfico.

Por ejemplo, si usted quiere una garrapata colocado junto a una Sub men Opcin 3 en base
a la fecha de ser un da impar del mes esta se hara simplemente colocando lo siguiente en el
cuadro de comentarios de edicin del Sub Opcin 3:
*:MARKEXP MOD(DAY(DATE()),2) = 0

Figure 7: Sub Menu with Mark


El siguiente conjunto de extensiones del generador se aplica a la creacin de las acciones a
nivel emergente. Las extensiones permiten a nominar el cdigo que se ejecuta cuando se
pulsa el botn de accin y la clase de contenedor para agregar a la ventana tip accin. El
cdigo para lograr esto se hace mediante la inclusin del texto siguiente en el cuadro de
comentarios de edicin como se muestra aqu:
*:ACTIONEXP [MESSAGEBOX(test action, 64, test)]
*:ACTIONTIP [cntActionTip]

LOS PRXIMOS PASOS


Ahora que existe el marco bsico que hay algunas cosas que hay que hacer para poner en
orden en los bordes y para aadir alguna funcionalidad adicional, sobre todo ampliar la
gestin de eventos y aadir desollar capacidad. Puede ser posible hacer uso de GDI + para la
presentacin de la interfaz de usuario, pero creo que el uso de mapas de bits y / o PNGs
transparentes puede lograr el mismo resultado con menos dolor.
Apoyo para que el usuario pueda minimizar el men de la ficha de manera que todo lo que se
ve son las fichas de men es algo que tiene que suceder.