Coordenadas de caja con bordes redondos

Post Reply
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Coordenadas de caja con bordes redondos

Post by Pedro »

Hola a todos

Un pequeño inconveniente que me acaba de surgir, por si le ha pasado a alguno.

En la impresión de facturas, utilizando la clase Tprinter, pongo _ redondeadas donde encierro, en una de ellas, los datos de la factura y en la otra los datos del cliente. Esto funcionaba bien en FW 2.7.
Ahora he pasado todo el programa a FWH 8.04 y mi sorpresa es que las cajas salen al revés.

CajaRound( 5, 1, 7.7, 10.2, 200, 200, oPrn, oPen2)
CajaRound( 5, 10.3, 7.7, 20, 200, 200, oPrn, oPen2)

Code: Select all

Function CAJAROUND(nArriba,nIzq,nAbajo,nDerecha,a,b,oPrn,oPen)

 LOCAL hOldPen, xCor := {} , yCor := {}

 xCor := oPrn:Cmtr2Pix(nArriba,nIzq)
 yCor := oPrn:Cmtr2Pix(nAbajo,nDerecha)

 // Guardamos el Pen que teniamos
 hOldPen := SelectObject( oPrn:hDcOut, oPen:hPen )

 //Dibujamos el rectangulo redondeado
 roundrect(oPrn:hdcOut,xCor[1],xCor[2],yCor[1],yCor[2],a,b)

 // y lo seleccionamos el que habiamos guardado
 selectObject( oPrn:hDcOut, hOldPen )

 RETURN NIL
Esto es de The Full, un ejemplo publicado para hacer cajas con el borde redondeado.
Si cambio los dos primeros parámetros, la caja sale más o menos bien, el fallo es que no pinta la línea inferior, y la une a la caja general del cuerpo de la factura, que esa si la pinta bien.
Esto en la primera caja.
La segunda caja con los parámetros originales, ni la pinta, pero si cambio los dos primeros parámetros, me la pinta junto a la primera.
Mi duda es : los parámetros en la funcion roundrect son diferentes?
en vez de Arriba, Izquierda, Abajo, Derecha,......son Izquierda, Arriba, Derecha, Abajo?, o cómo son?

Un saludo a todos
Pedro
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

Este es el método ROUNDBOX de la clase Tprinter:

RoundBox Draws a box with rounded corners.

Syntax: <oPrn>:RoundBox( <nTop>, <nLeft>, <nBottom>, <nRight>, <nWidth>, <nHeight>, <oPen>, <nBGColor> )
Parameters: <nTop> The coordinates of the box to draw. By default they <nBottom> are expressed in pixels, unless a different <nLeft> SetMapMode() mode is selected. <nRight> <nWidth> The width of the ellipse used to draw the rounded corners. <nHeight> The height of the ellipse used to draw the rounded corners. <oPen> It is an optional pen object to use for painting the box. <nBGColor> It is an optional color to be used for the box background. To create it use: DEFINE PEN oPen STYLE ... COLOR ... WIDTH ...
Returns: Nil.
Un saludo

Manuel
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Post by Pedro »

Gracias Manuel, pero poniendo oPrn:RoundBox y las mismas coordenadas, ni me pinta la caja...
Busqué el método en la clase Tprinter y puse lo mismo sin el color
oPrn:RoundBox(5, 1, 7.7, 10.2, 200, 200, oPen2)
oPrn:RoundBox(5, 10.3, 7.7, 20, 200, 200, oPen2)
y lo mismo con los dos primeros parámetros al reves
oPrn:RoundBox(1, 5, 7.7, 10.2, 200, 200, oPen2)
oPrn:RoundBox(10.3, 5 , 7.7, 20, 200, 200, oPen2)
ninguna de las _ se pintaban.
No sé el motivo, pues antes se pintaban, como se pinta la caja central correctamente.
Caja(8.5,1,24,20, oPrn,0,,oPen1) // Caja General

Code: Select all

Function Caja(nArriba,nIzq,nAbajo,nDerecha,oPrn,nTipo,oBrush,oPen)

Local xCor := {} , yCor := {}

// Pasamos coordenadas de cms a pixel

xCor := oPrn:Cmtr2Pix(nArriba,nIzq)
yCor := oPrn:Cmtr2Pix(nAbajo,nDerecha)

DO CASE
   CASE nTipo == 0	 // Caja Vacia
	oPrn:Box(xCor[1],xCor[2],yCor[1],yCor[2],oPen)
   CASE nTipo == 1	 // Caja rellena
	oPrn:FillRect({xCor[1],xCor[2],yCor[1],yCor[2]},oBrush)
ENDCASE

return NIL
como veras la única diferencia es el uso de oPrn:Box o bien oPrn:RoundBox, éste método llama a la función RoundRect( ::hDCOut, nRow, nCol, nBottom, nRight, nWidth, nHeight ) de la misma forma que lo hace el ejemplo de The full
//Dibujamos el rectangulo redondeado
roundrect(oPrn:hdcOut,xCor[1],xCor[2],yCor[1],yCor[2],a,b)

Lo que no entiendo es por qué las cajas salen al reves, es decir si lo más largo de la caja es desde Izquierda a Derecha, me lo pinta de Arriba a Abajo. Si pongo las coordenadas al reves, me lo pinta bien, pero la linea inferior no la pinta y pega la caja a la linea de la caja general.
Espero que Antonio si lee esto pueda dar un respuesta.

Un saludo y gracias Manuel
Pedro
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

¿y no será que estás aplicando cms y pixels?. Yo lo hago utilizando una función propia (RCAJA) y aplicando tu ejemplo me ha salido perfectamente. Prueba lo siguiente:

RCaja(oPrn, 5, 1, 7.7, 10.2, 200, 200, oPen2 )
RCaja(oPrn, 5, 10.3, 7.7, 20, 200, 200, oPen2)



Func RCaja(oPrn, nArriba, nIzq, nAbajo, nDerecha, nAncho, nAlto, oPen, nColor )
Local xCor := {} , yCor := {}

// Pasamos coordenadas de cms a pixel
xCor := oPrn:Cmtr2Pix(nArriba,nIzq)
yCor := oPrn:Cmtr2Pix(nAbajo,nDerecha)

oPrn:RoundBox(xCor[2],xCor[1],yCor[2],yCor[1],nAncho,nAlto,oPen, nColor )

return NIL
Un saludo

Manuel
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Post by JoseLuis »

Pedro

Yo la utilizo, y no me da ningun problema

Code: Select all

 //-------------------
 Function CAJAROUND(nArriba,nIzq,nAbajo,nDerecha,a,b,oPrn,oPen,oBrush)
 LOCAL hOldPen, xCor := {} , yCor := {}
 local hOldBrush
 // Pasamos coordenadas de cms a pixel
 xCor := oPrn:Cmtr2Pix(nArriba,nIzq)
 yCor := oPrn:Cmtr2Pix(nAbajo,nDerecha)
 // Guardamos el Lapiz y la brocha que teniamos
 hOldPen   := SelectObject( oPrn:hDcOut, oPen:hPen )
 hOldBrush := SelectObject( oPrn:hDcOut, oBrush:hBrush )
 //Dibujamos el rectangulo redondeado
 roundrect(oPrn:hdcOut,xCor[1],xCor[2],yCor[1],yCor[2],a,b)
 // y  seleccionamos el que habiamos guardado
 selectObject( oPrn:hDcOut, hOldPen )
 selectObject( oPrn:hDcOut, hOldBrush )
 RETURN NIL
Mira a ver si te funciona, con éstas diferencias.

Saludos

Jose Luis
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Pedro,
Prueba a usar cmtr2pix como te mencionan jose luis y manuel, te debe funcionar,,, a mi tambien me funciona bien asi.
salu2
paco
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Post by Pedro »

Hola Manuel, Jose Luis, Francisco
No se si os habeis fijado en el ejemplo que puse al principio, pero si os fijais un poco, vereis que el problema era, que las coordenadas en FW 2.7 son xCor[1], xCor[2],yCor[1], yCor[2], eso es lo que no funciona en FW8.04, se ha debido modificar. En el ejemplo de Manuel, las coordenadas son xCor[2],xCor[1],yCor[2], yCor[1] y esto si que funciona. El ejemplo de Jose Luis es el mismo que el mio, si lo prueba verá que no le funciona, cosa curiosa, pues en el ejemplo de la caja normal, sin bordes redondeados, funcionan las coordenadas xCor[1], xCor[2], yCor[1], yCor[2], de ahí que preguntara si desde la version 2.7 se habian cambiado las coordenadas en la funcion roundrect(), como así he comprobado.

Un saludo a todos y gracias por la ayuda.
Pedro
Post Reply