Page 1 of 2

Enmarcar un XBrowse

PostPosted: Tue Nov 05, 2013 4:16 pm
by Carlos Mora
Otra vez yo con mis dibujos :)

resulta que estoy tratando de pintar un tema muy "flat", al estilo W8, y más o menos va quedando. Los XBrowses se pueden pintar planos, poniendoles la DATA lFlatStyle en .T. y el controls de los recursos con el estilo 0x50210000L. Esto hace que el browse se vea así

Image

Puedo ponerle un estilo 0x50A10000L en el recurso, pero me hace un efecto hundido 3d que no pega con la estética del resto.
Image

Quise usar bPainted para pintar un rectángulo, pero XBrowse no llama a bPainted con o el resto de los controles.
¿Alguna sugerencia de como dibujar un rectángulo de 1 pixel alrededor del browse?
Preferiría no tocar la clase xbrowse en lo posible.

Re: Enmarcar un XBrowse

PostPosted: Tue Nov 05, 2013 5:22 pm
by TecniSoftware
Probaste pintar el rectangulo desde el on init del dialogo o ventana que estas usando?

Saludos

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 9:06 am
by Carlos Mora
Hola Alejandro,
Gracias por la idea, pero creo que no daría resultado. Puede que al inicio se pinte bien, pero luego no se repintará si la ventana pierde el foco y luego lo vuelve a tomar, por ejemplo.
La idea que tengo es armar las cosas para que tengan un aspecto plano como en Win8, y esos detalles de estilo quiero ponerlos en una función para cada tipo de control que sirva para "estilizarlo".
:bPainted sería una muy buena opcion, asi cada vez que hay un refresh me asegura que se dibuja el rectángulo, e incluso si en lugar de dialogo es una MDIChild que puede cambiar de tamaño, es por donde encaré primero, pero parece que no funciona en los XBrowses.

Un saludo

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 9:37 am
by hmpaquito
Carlos,

¿ Cual bPainted ? ¿ oDlg:bPainted o oBrw:bPainted ? Si quieres utilizar el DC que viene en el codeblock entonces habria de ser el oDlg:bPainted pq el DC del oBrw no puede pintar "mas alla" de sus dimensiones y desplazar todas las posiciones del browse top, left, bottom, right en un pixel que es el tamaño del marco seria una locura.

Asi que creo que habria que utilizar el oDlg:bPainted necesariamente, que seria oBrw:oWnd:bPainted.

La verdad... veo dificil la cosa... te agradeceria que si lo consigues nos lo hicieras saber. Quiza que la misma tecnica se pueda usar para pintar en otros controles.

Un saludo.

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 10:44 am
by Carlos Mora
El tema de usar el oBrw:bPainted del control lo copié de unos hilos en el foro donde hablaban de resaltar gets cuando tenian el foco. El unico inconveniente que hay es que tendría que modificar la XBrowse para que en algún momento llame a la bPainted si es un codeblock, porque el XBrowse como tal no la llama como el resto de los controles.
Es cierto que se podría usar el bPainted del diálogo, pero sería una solución no muy estructurada, y en muchos casos estoy usando MDIChild, que no se como se comportan.
La idea es crear una función que llamo en el INIT de la creación del diálogo/window, y con el XBrowse creado, dibujar un rectangulo gris que solo le de forma. Si el browse tiene datos el recuadro no es necesario, solo en las partes que quedan blancas.
Estoy pensando que podría crear una funcion que cree un TPanel en el dialogo/window, y que el XBrowse se haga hijo de ese TPanel, y el panel sea el que dibuja el rectángulo.
Voy a ver que se puede lograr con esto.

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 11:18 am
by hmpaquito
El tema de usar el oBrw:bPainted del control lo copié de unos hilos en el foro donde hablaban de resaltar gets cuando tenian el foco.

Si, pero si no me equivoco, en ese caso el bPainted funciona porque no pinta fuera de los límites del get.


Estoy pensando que podría crear una funcion que cree un TPanel en el dialogo/window, y que el XBrowse se haga hijo de ese TPanel, y el panel sea el que dibuja el rectángulo.
Voy a ver que se puede lograr con esto.

Si es otra forma de abordarlo. Hacer una clase "intermedia" que albergue el browse y le añada el marco y encapsule la complejidad. Podria ser algo asi como TBrowsePanel()

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 11:37 am
by Carlos Mora
hmpaquito wrote:
El tema de usar el oBrw:bPainted del control lo copié de unos hilos en el foro donde hablaban de resaltar gets cuando tenian el foco.

Si, pero si no me equivoco, en ese caso el bPainted funciona porque no pinta fuera de los límites del get.

Claro, la idea básica es dibujar una línea tenue donde el browse, por no tener datos, no pinta nada y deja una zona blanca. Si tiene datos el recuadro no es necesario.


hmpaquito wrote:
Estoy pensando que podría crear una funcion que cree un TPanel en el dialogo/window, y que el XBrowse se haga hijo de ese TPanel, y el panel sea el que dibuja el rectángulo.
Voy a ver que se puede lograr con esto.

Si es otra forma de abordarlo. Hacer una clase "intermedia" que albergue el browse y le añada el marco y encapsule la complejidad. Podria ser algo asi como TBrowsePanel()

Si, es ambicioso, creo que excede un poco lo que tengo que hacer, y, ya sabes, los proyectos tienen tiempos limitados.

Un saludo

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 12:09 pm
by hmpaquito
Claro, la idea básica es dibujar una línea tenue donde el browse, por no tener datos, no pinta nada y deja una zona blanca. Si tiene datos el recuadro no es necesario.


Tendrás que luchar contra el browse: intentará pintar lo suyo encima del marco que tu pintes porque queda dentro de sus límites. Espero que le puedas :wink:

Yo había entendido que querías un recuadro a todo alrededor y no sólo en la zona donde no hay datos, sin invadir el browse. Me equivoqué.

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 2:08 pm
by cnavarro
Carlos
No entiendo bien lo que necesitas: no sé si es un marco interior, o exterior, o si es pintar la lineas interiores cuando los datos no llegan a ocupar todo el browse
Por cierto, mi correo es: navarro.cristobal at gmail.com

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 3:02 pm
by Carlos Mora
Hola Cristobal,

Si miras la primera imagen, verás que la parte inferior no queda enmarcada. Donde se pintan datos no hay tanto problema, pero abajo queda un poco descompensado.
La idea es, para simplificar y pintar en la region del propio browse, dibujar un rectángulo gris para que quede mas compensado.

Image

El rectangulo lo dibujé a mano, no es muy preciso, pero es la idea.

Si bPainted funcionase, se podría poner
Code: Select all  Expand view

  oBrw:bPainted:= {|hDC|
         LOCAL hPen := CreatePen( PS_SOLID, 1, GRIS )
         Rectangle( hDC, 0, 0, oBrw:nWidth, oBrw:nHeight, hPen )
         DeleteObject( hPen )
         RETURN NIL
         }
 

o algo parecido
Tomo nota del mail!

Gracias,

Re: Enmarcar un XBrowse

PostPosted: Wed Nov 06, 2013 7:03 pm
by cnavarro
Carlos imagino que lo que pretendes es algo asi:

Image

El ejemplo esta hecho con código ya que con el cambio a estos estilos no me llevo muy bien con los generadores de recursos :cry:

Re: Enmarcar un XBrowse

PostPosted: Thu Nov 07, 2013 4:01 pm
by Carlos Mora
cnavarro wrote:Carlos imagino que lo que pretendes es algo asi:

SI! Exacto! How-to?

Re: Enmarcar un XBrowse

PostPosted: Thu Nov 07, 2013 5:08 pm
by cnavarro
Pues creo que nada del otro mundo, es un xbrowse normal:

Code: Select all  Expand view

Local oFont
Local oFontX
Local nFI       := ( 5 + 25 ) * 2
Local nFIG      := nFI + 20*2
Local nCI       := 6
Local nCIG      := nCI + 2*2
Local nInc      := 40*2
Local nW        := 264
Local nH        := 24/0.8
Local oBrw

aTablasStruc    := { {"EMPTY","U", 0, 0,"EMPTY", 0} }

   DEFINE FONT oFont  NAME "Segoe UI Light" SIZE 0, -20  //-52
   DEFINE FONT oFontX NAME "Segoe UI SemiLight" SIZE 0, -14  //-52

//? GetDialogBaseUnits()[ 1 ], GetDialogBaseUnits()[ 2 ]

   @ nFI - 50, nCI SAY oTitPnel1 PROMPT " Tabla:  [ "+;
               IF( Empty( cTblMdb ), " SIN SELECCION ", ;
                                      " " + Upper( cTblMdb ) + " ")+" ]" ;
               SIZE nW, nH PIXEL oF oPnel1 ;
               COLOR METRO_WINDOW, METRO_GRIS1 FONT oFont

   @ nFI+nInc*0 + 2, nCIG XBROWSE oXBrwStruc ;
     ARRAY aTablasStruc ; //     CELL ;
     FONT oFontX ;
     SIZE nW-4, Int(nH)*11 - 20 PIXEL oF oPnel1 //NOBORDER

   WITH OBJECT oXBrwStruc
        :lHScroll        := .F.
        :lVScroll        := .F.
        :lHeader         := .T.
        :lRecordSelector := .F.
        :l2007           := .F.

        :bClrSel         := { || { METRO_WINDOWTEXT, METRO_WINDOW } }
        :bClrStd         := { || { METRO_WINDOWTEXT, METRO_WINDOW } }
        :bClrSelFocus    := { || { METRO_WINDOW, METRO_APPWORKSPACE } }

        :bClrHeader      := { || { METRO_WINDOW, METRO_GRIS4 } }
        :SetColor( METRO_WINDOWTEXT, METRO_WINDOW )

        :nRowDividerStyle  := LINESTYLE_NOLINES        //4
        :nColDividerStyle  := LINESTYLE_NOLINES        //4
        :nMarqueeStyle     := 5                        //3
        :nRowHeight        := nH
        :lAutoSort         := .F.

        :SetArray( aTablasStruc )

   END

   WITH OBJECT oXBrwStruc:aCols[ 1 ]

      :nWidth         := ( 2*Int((nW-6) / 4) ) //( 2*Int((nW-6) / 3) ) - 2
      :cHeader        := " Campo "  //" Field "
      :nDataStrAlign  := 0
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END
   WITH OBJECT oXBrwStruc:aCols[ 2 ]

      :nWidth         := ( 1*Int((nW-6) / 4) ) - 2 //Int( (nW-6) / 3 ) - 3
      :cHeader        := " Tipo "
      :nDataStrAlign  := 2
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END
   WITH OBJECT oXBrwStruc:aCols[ 3 ]

      :nWidth         := ( 1*Int((nW-6) / 4) ) - 2 //Int( (nW-6) / 3 ) - 3
      :cHeader        := "Len"
      :nDataStrAlign  := 2
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END
   WITH OBJECT oXBrwStruc:aCols[ 4 ]

      :nWidth         := Int( (nW-6) / 4 ) - 3
      :cHeader        := "Dec"
      :nDataStrAlign  := 2
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END
   WITH OBJECT oXBrwStruc:aCols[ 5 ]

      :nWidth         := ( 2*Int((nW-6) / 4) ) - 2 //Int( (nW-6) / 3 ) - 3
      :cHeader        := "Name Type"
      :nDataStrAlign  := 2
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END
   WITH OBJECT oXBrwStruc:aCols[ 6 ]

      :nWidth         := Int( (nW-6) / 3 ) - 3
      :cHeader        := "Type"
      :nDataStrAlign  := 1
      :lAllowSizing   := .F.
      :oHeaderFont    := oFont
   END

   oXBrwStruc:CreateFromCode()
 


Los codigos de color que utilizo los puedes ver en:
viewtopic.php?f=6&t=27003&p=150120&hilit=colores+ch#p150123
Como te dije en mi anterior post no utilizo recursos
Espero te solucione algo

Re: Enmarcar un XBrowse

PostPosted: Fri Nov 08, 2013 9:51 am
by Carlos Mora
Hola Cristobal,
una duda...
cnavarro wrote:Pues creo que nada del otro mundo, es un xbrowse normal:
.....
Como te dije en mi anterior post no utilizo recursos
Espero te solucione algo

¿Que versión de windows estás usando? Porque en W7 el marco que me dibuja, si lo indico con el Style, es un marco 3d, que queda muy fuera de lugar en una estética 'flat', como se ve en las imágenes del primer post.

de todas maneras pruebo lo que posteaste a ver como va y comento algo.

Re: Enmarcar un XBrowse

PostPosted: Fri Nov 08, 2013 9:54 am
by cnavarro
Windows 8, pero pondre una imagen con W7