Tutorial - Tab Menu
Tutorial - Tab Menu
Tutorial - Tab Menu
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.
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.
Descripcin
Este componente contiene los artculos que solan encontrarse en el men
Quick Bar
Menu Tab
Popup
Hotkey
Help Item
Control Box
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.
Class
Description
cntControl
cntHelpItem
cntMenuItem
cntPopupItem
cntPopupMenu
cntQuickBar
cntQuickItem
cntSearchBox
cntStartItem
cntTabMenu
frmStartMenu
tbrTabMenu
frmPopup
frmTabMenu
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
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
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
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.
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.
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.
0x0100
0x0101
0x0105
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.
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
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
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
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:
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