Page 1 of 1

No me pinta Rectangle en TCanvas

Posted: Sun Apr 14, 2019 2:45 pm
by buzonjmartial
Buenos días,

Tenía una función que pintaba 2 rectángulos y un relleno en Xailer 1.9, ahora me ha dejado de funcionar con xailer 6.1 el pintar el rectángulo.

Code: Select all

WITH OBJECT oCanvas := TCanvas():Create(Screen)
        :hDC := hDC
        :Rectangle( {nLeft,nTop, nWidth, nHeight})                               // AHORA NO PINTA NADA
        :FillRect( {nLeft+1,nTop+1, nWidth-1, nHeight-1}, oBrush)
        :Rectangle( {nLeft2,nTop2, nWidth2, nHeight2})                        // AHORA NO PINTA NADA                       
    END


Haciendo esta modificación y llamando a la función en C rectangle, si me los pinta:

Code: Select all

WITH OBJECT oCanvas := TCanvas():Create(Screen)
        :hDC := hDC
        Rectangle(:hDC, nLeft,nTop, nWidth, nHeight)
  //   :Rectangle( {nLeft,nTop, nWidth, nHeight})
        :FillRect( {nLeft+1,nTop+1, nWidth-1, nHeight-1}, oBrush)
  //   :Rectangle( {nLeft2,nTop2, nWidth2, nHeight2})
        Rectangle(:hDC, nLeft2,nTop2, nWidth2, nHeight2)
    END



¿ Que estoy haciendo mal?

Re: No me pinta Rectangle en TCanvas

Posted: Mon Apr 15, 2019 11:36 am
by ignacio
Buenos días,

El pintado de cualquier control se debe de realizar en su evento ONPAINTED y utilizando el HDC que proporciona el evento. Asegurese de que la brocha que está pasando como parámetro esta inicializada.

Saludos

Code: Select all

METHOD Bevel1Painted( oSender, hDC, cPaintStruct ) CLASS TForm1

   LOCAL oCanvas AS CLASS TCanvas
   LOCAL oBrush AS CLASS TBrush
   LOCAL aRect

   oCanvas := TCanvas():NewFromDC( hDC )
   oBrush  := TBrush():New()
   oBrush:nColor := clRed
   oBrush:Create()

   aRect   := GetClientRect(oSender:Handle)
   InflateRect( aRect, -5, -5)
   oCanvas:Rectangle( aRect, oBrush )
   oBrush:End()
   oCanvas:End()

RETURN Nil

Re: No me pinta Rectangle en TCanvas

Posted: Mon Apr 15, 2019 12:39 pm
by buzonjmartial
Buenos días Ignacio,

He puesto de la forma que funciona y con TCanvas no funciona.

Para que funcione obviamente el hDC tiene que ser válido. Y está en el PAINT del control.

Esta es la función en C que funciona perfectamente en el ejemplo que he puesto.

Code: Select all

HB_FUNC( RECTANGLE )
{
  hb_retl( Rectangle( (HDC) hb_parnl(1), hb_parni(2),hb_parni(3),hb_parni(4),hb_parni(5)) );
}

Re: No me pinta Rectangle en TCanvas

Posted: Mon Apr 15, 2019 1:11 pm
by ignacio
2019-04-15 13_10_37.png
2019-04-15 13_10_37.png (7.67 KiB) Viewed 749 times


Si sabes hacerlo mejor que yo. Lo siento, pero no entiendo porque preguntas. :-(

Re: No me pinta Rectangle en TCanvas

Posted: Tue Apr 16, 2019 10:16 am
by buzonjmartial
Buenos días Ignacio,

Ya he encontrado la diferencia de comportamiento con Xailer 1.9

Parece ser que creé la función rectangle en C como te puse en el mensaje anterior y la llamada sería
Rectangle( :hDC, nLeft , nTop, nRight, nBottom), (Creo que no existía dicha función en Xailer 1.9) y
en la versión de Xailer 6.1 habéis hecho el wrapper a la función rectangle( hDC, aRect), la cual causaba conflicto con la que hice yo.

Era sólo eso, y lo puse aquí en el foro para averiguar por qué ocurría.
Le he cambiado el nombre a mi wrapper y ya toma la función de Xailer rectangle, con lo cual, la TCanvas ya
pinta los rectángulos con su método ::rectangle().

Gracias,