Enmarcar un XBrowse

Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Enmarcar un XBrowse

Post 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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: Enmarcar un XBrowse

Post by TecniSoftware »

Probaste pintar el rectangulo desde el on init del dialogo o ventana que estas usando?

Saludos
Alejandro Cebolido
Buenos Aires, Argentina
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post 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
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Enmarcar un XBrowse

Post 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.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post 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 _ 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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Enmarcar un XBrowse

Post 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()
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post 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
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Enmarcar un XBrowse

Post 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é.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Enmarcar un XBrowse

Post 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
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post 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

  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,
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Enmarcar un XBrowse

Post 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:
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post by Carlos Mora »

cnavarro wrote:Carlos imagino que lo que pretendes es algo asi:
SI! Exacto! How-to?
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Enmarcar un XBrowse

Post by cnavarro »

Pues creo que nada del otro mundo, es un xbrowse normal:

Code: Select all

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:
http://forums.fivetechsupport.com/viewt ... ch#p150123
Como te dije en mi anterior post no utilizo recursos
Espero te solucione algo
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Enmarcar un XBrowse

Post 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.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Enmarcar un XBrowse

Post by cnavarro »

Windows 8, pero pondre una imagen con W7
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Post Reply