FoxRibbon Camf v 0. 45 - Impresiones y toma de contacto.

18/04/2020

 

Estoy desde la version 0.41 sin sacar una revisión. La revisión de la que haremos entrega será la 0.45. Si, así es, he tenido que ir almacenando las versiones como copias de seguridad mientras iba alcanzando mi objetivo.

Se han corregido algunos Bug:

  • Corregido Bug al iniciar una aplicación en modo Screen. La ventana principal se podía quedar detrás de otras ventanas.
  • Corregido Bug en SelectStyle
  • He encontrado un bug común a todas las versiones FoxRibbon, desde la 0.14 desde la que comencé a trastear. Este bug consiste en que si con el cursor del ratón en la barra de titulos, lo mantienes pulsado para deslizar la ventana, si lo haces rápidamente de izquierdas a derechas se pueden marchar de la pantalla otras aplicaciones abiertas. Me ocurre en mi sistema con Windows 10, y trabajando con dos pantallas. Desconozco si ocurre en otras versiones de Windows. Para mi fue muy desagradable, pero ahora ya lo he corregido. Nota: Puede que sea un problema de mi tarjeta gráfica, pero me ocurre.

Como yo soy un usuario multipantalla, he echado muchas horas con FoxRibbon en el tema de los citados monitores. Como nos lo ha dejado el maestro, sólo teníamos posibilidad de tener una ventana en otra pantalla siempre y cuando no se maximice la misma, pues el maximizado en la version 0.14, cuando operamos en varios monitores, siempre tenía lugar en la pantalla principal. Yo había trabajado en ello y lo había conseguido, pero a base de perder estética en este campo y me di cuenta que al fin y al cabo solo compensaba a los que usamos varios monitores.

He de explicar a los más noveles que realmente, salvo unas excepciones, FoxRibbon siempre ha trabajado con lo que yo he bautizado como un maximizado simulado. En pocas palabras, cuando maximizamos ajustamos las coordenadas de nuestra pantalla a las dimensiones full sin comernos la barra de Windows que es la madre de todo este tema. Un WindowState 2 (maximizado) se comería la barra de Windows. Usted mismo puede hacer la prueba pidiendo un informe de estado de su WindowState cuando tiene la ventana maximizada, y llevara la sorpresa de que su valor es 0 (Normal). Al mismo tiempo esta situación ocurre cuando trabajamos en Visual FoxPro con un estado de Titlebar = 0 lo que equivale a no tener barra de títulos aunque nosotros la veamos. Por supuesto que la vemos, pero se trata de una barra de títulos personalizada y para ello , el titlebar de nuestra ventana tiene que ser = 0.

Si le interesa este tema porque quiere diseñar una ventana elegante con su titulo personalizado, etc, etc..., he publicado un artículo donde trato a fondo este tema, todo lo que debe tenerse en cuenta, excepciones, etc. siempre desde mi punto de vista. El articulo tiene pendiente una revisión en breve. Aplicaciones sin barra de títulos - Simular maximizado.

La versión 0.45 contará con un WindowState real salvo, según pruebas, salvo excepciones que siempre las hay. La única excepción que he encontrado hasta la fecha ha sido cuando queremos utilizar una ventana de formulario contenida en la ventana principal de Visual FoxPro, es de decir Desktop = .T.. Para solucionar todo esto he creado dos nuevas clases utilizables con cualquier herramienta para programar en Visual Foxpro, no sólo FoxRibbon.

Estas clases se llaman:

  • OnApps: Es un simulador de maximización que voy a detallar mejor cuando revise el artículo del que le he facilitado el enlace.
  • OnApp: Es la que ya he aplicado a la próxima actualización de FoxRibbon. Próximamente un artículo sobre esta clase.

Nota: Al final he incluido todo en la clase OnApp con un selector de modos y el proyecto OnApps ha quedado discontinuado.

 

¿Por qué crear otra clase para el maximizado además de incluirla en la clase _titlebar barra de títulos?

El motivo, después de cinco años trasteando el FoxRibbon, es que siempre nos encontramos obligados a tener barra de títulos, cuando tenemos una ventana que queremos redimensionar, es decir, poder hacer lo mismo que ya hacemos con nuestra típica barra y una opción sería mantenerla oculta, pero esta clase elimina estas complicaciones y, solo con agregarla y tres instrucciones típicas, ya tenemos toda la funcionalidad de de la barra.

Voy a poner un ejemplo sencillo. Voy a crear un formulario sin barra de título y le voy a añadir tres botones con la funcionalidad de maximizar, restaurar y minimizar pues con salir nunca hemos tenido problemas. Ya tenemos todo el diseño y ahora agregamos la clase OnApp. A cada evento click le añadimos lo el siguiente código:

  • Maximizar: ThisForm.OnApp.WindowState = 2
  • Restaurar: ThisForm.OnApp.WindowState = 0
  • Minimizar: ThisForm.OnApp.WindowState = 1

Así de sencillo, ya no tengo necesidad de añadir una barra de títulos que luego debería de ocultar etc etc. , además, si utiliza el modo 3 (aún en revisión), consulte su WindowState y verá que es el Real y no simulado como hasta la fecha, siempre con valor 2.

La excepción de la que hemos hablado antes, que es cuando tenemos una ventana con Desktop = .T., tendría el efecto de taparnos la barra de Windows con una instrucción como ThisForm.OnApp.WindowState = 2, pero no se preocupe, pues OnApp lo va a detectar y va a pasar automáticamente al modo de emergencia, simulando un maximizado por simulación a la antigua usanza.

Este artículo es un avance de lo que será la próxima versión que liberamos de FoxRibbon.

Otras dos cosas para terminar por hoy:

La clase OnApp se ha incluido por completo en la clase_titlebar con el mismo funcionamiento y se ha eliminado al completo el código que siempre ha manejado el maximizado anteriormente. También se incluye ahora en FoxRibbon la clase OnApp_class.prg para los casos en que queramos utilizar una ventana sin barra de títulos

Otra es que he notado un incremento de velocidad, a la hora de abrir una aplicación en la que interviene FoxRibbon, de más del 25 por ciento.

Continuara...

20/04/2020

Aquí estoy de nuevo.

Siguiendo con el tema se ha modificado la clase _titlebar como habíamos dicho anteriormente.

 

Modificaciones de la clase _Titlebar

Las modificaciones son las siguientes:

  • _TitleBar.ControlButtons.ButonMax.Click: Aquí se ubicaba el código que manejaba el maximizado-minimizado en FoxRibbon, se ha eliminado y se han dejado instrucciones para procesar el nuevo método _TitleBar.WindowState_assing que se va a encargar de todo.
  • _TitleBar.ControlButtons.ButonMin.Click: nuevo código.
  • _TitleBar.Shape1.MouseMove: Aquí se ubica el código que nos permite deslizar nuestra ventana en la pantalla al mantener el botón izquierdo del ratón sobre la barra de títulos al mismo tiempo que arrastramos. Si abre el evento verá una variable LOCAL lmode que le da dos posibilidades de hacer lo mismo con distinto código. Utilice el valor que mejor se ajuste a sus necesidades.

Ahora voy a nombrar las propiedades, métodos y eventos de la clase _titlebar, nuevas propiedades, métodos y modificaciones:

  • Init:

Código anterior

Nuevo Código

     .ADDPROPERTY("FormMax", .F.)
     .ADDPROPERTY("FormLeft", 0)
     .ADDPROPERTY("FormTop", 0)
     .ADDPROPERTY("FormHeight", 0)
     .ADDPROPERTY("FormWidth", 0)
     .ADDPROPERTY("FormBorder", 0)
   
      IF THISFORM.WINDOWSTATE = 2
         THISFORM.WINDOWSTATE = 0
         THISFORM.LEFT = 20
         THISFORM.TOP = 10
         THISFORM.HEIGHT = SYSMETRIC(2) - 65
         THISFORM.WIDTH = SYSMETRIC(1) - 40
         .SetParamForm()
         .ControlButtons.ButtonMax.CLICK()
     ELSE
         .SetParamForm()
     ENDIF
     .AddProperty("OldBorderStyle", 0)
     .AddProperty("OldLeft", 0)
     .AddProperty("OldTop", 0)
     .AddProperty("OldHeight", 0)
     .AddProperty("OldWidth", 0)
 
     IF thisform.WindowState # 0	&& restaura si es minimizado o maximizado, tiene que tomar medidas
        IF .WindowState = 2
        llWindowState =.T.
     ENDIF
     thisform.WindowState = 0
 
     *- Y que en un simulado de maximizar tenemos que tener las medidas
     .SetParamForm()				&& toma medidas
       IF llWindowState 
        .ControlButtons.ButtonMax.CLICK() &&maximiza
       ENDIF 
     ELSE
       .SetParamForm() 
     ENDIF 

Se ha cambiado el nombre de las propiedades que añadimos y se ha sustituido la propiedad lógica FormMax, ya que hemos creado el método WindowState_assing con su correspondiente propiedad numérica WindowState.

IF THISFORM.WINDOWSTATE = 2 indica que la ventana viene maximizada (tapamos la barra de Windows) y como estamos utilizando simulación de maximizado debemos de guardar en la memoria SetParamForm las coordenadas cuando WindowState es 0 (Normal) para cuando toca restaurar la ventana. Ahora, por el mismo motivo se ha modificado a IF thisform.WindowState # 0, es decir, si viene minimizada, también necesitamos memorizar coordenadas antes de maximizar ventana. Se deduce que el paso por el estado WindowState= 2 es siempre obligatorio al inicio.

Si ya tenemos la ventana en su estado normal 0 sobran las demás líneas hasta SetParamForm que redimensionan de nuevo la ventana.

Una vez que tenemos todas las coordenadas memorizadas, entonces si, con .ControlButtons.ButtonMax.CLICK() (que es lo mismo que hacer un .MaximizeForm), podemos maximizar la ventana. Una vuelta obligatoria en simulación de maximizado. Esto tiene efectos secundarios de tipo flash al abrir nuestra ventana. No recomiendo nunca partir de WindowState = 2, hágalo desde 1 ó 0.

Else -> SetParamForm Si ya estamos en un WindowState = 0 simplemente memorizamos coordenadas.

En este color las nuevas:

  • Resize: Sin modificaciones
  • BorderStyleValue: Indicamos con que BorderStyle se maximiza la ventana 0 - 1 - 2 - 3. Por defecto 0. Sólo recomiendo 0 ó 1. Veremos el borde en la pantalla cuando este maximizada. Al restaurar recuperamos de la memoria el borde inicial de la ventana. 2 y 3 pueden tener como efecto secundario transparencia en el borde. 3 es inutilizable y antiestético. Se ha dejado, pues puestos ya no costaba dejar la opción. Operativa en los modos 1 y 2.
  • BorderStyleYes: Si su valor es .T. queda inoperativa la propiedad anterior. Habilitada consigue que la ventana se maximice con el BorderStyle actual, sea el que sea. Operativa en los modos 1 y 2.
  • Buf2dWord: Incluida en la version 0.14 de FoxRibbon. Se utiliza en el modo 1
  • Camf_engine: valor .T. al igual que antes
  • ChangeState: Método que utiliza redimensión con WindowState = 2 real. Vea Clase OnApp donde se detalla el funcionamiento. La utiliza el Modo 3.
  • FullScreen: Consigue un redimensionamiento perfecto al maximizar, pero tapando la barra de Windows. Digo perfecto porque con un WindowState = 2, parece que el efecto es el mismo, pero no es del todo cierto. WindowState = 2 cuando TitleBar = 0 nos tapa la barra de Windows y ademas tiene como efecto secundario un desbordamiento de la ventana en la pantalla. Funciona así en los modos 1 y 2, pero en el modo 3 tenemos el citado desbordamiento apreciable en las esquinas.
  • lnMode: Tres modos de funcionamiento (1 - 2)-> con (3)-> sin simulación de maximizado y WindowState real. Se incluye pero está en modo de revisión. El modo 1 y 2 realizan una simulación de maximización pero con diferentes códigos. Pruebe sus resultados y si encuentra diferencias, utilice el que mejor se adapte a sus necesidades.
  • LockScreen: Método que utilizaba hasta ahora para evitar ver efecto flash hasta ahora, pero con efectos secundarios. Se mantiene pero no se usa. Sobre la marcha decidiré si eliminarlo, pero de momento no estorba.
  • MaximizeForm: Sin modificaciones.
  • MaximizeWindow: accesada por WindowState_assing
  • ReDraw: No se ha alterado.
  • RestoreWindow: accesada por WindowState_assing
  • SetParamForm: Sistema de memoria. Es un método donde se ubican las instrucciones que guardan las coordenadas de la ventana en WindowState = 0 (Normal). Se ha cambiado el nombre de las propiedades.

Código anterior

Nuevo Código

     WITH THISFORM
       THIS.FormBorder = .BORDERSTYLE
       THIS.FormLeft = .LEFT
       THIS.FormTop = .TOP
       THIS.FormHeight = .HEIGHT
       THIS.FormWidth = .WIDTH
       THIS.FormMax = .F.
     ENDWITH
     WITH thisform
       * this.WindowState = 0 propiedad de WindowState_assing
       this.OldBorderStyle = .BorderStyle
       this.OldLeft   = .Left
       this.OldTop    = .Top
       this.OldHeight = .Height
       this.OldWidth  = .Width 
     ENDWITH

 

  • ShowBackImage: Sin cambios
  • Teacher: Sin cambios
  • WindowState: -> WindowState_assing
  • WindowState_assing: Método principal que administra el maximizado, restauración y minimizado de las ventanas

 

 


 

Contenidos de este sitio Web

Nueva clase FoxRibbon 0.45

Autor artículo: Camf


 

 

 



error: Contenido protegido