Page 4 of 5

Posted: Fri Sep 14, 2007 9:42 pm
by Antonio Linares
Podriais hacer la siguiente prueba ? Aqui no conseguimos hacerlo fallar

En la clase TWindow Method paint():

Code: Select all

static lPainting := .f.

if ! lPainting
   lPainting = .T.
else
   MsgBeep()
endif

...
if lPainting
   lPainting = .F.
endif
La idea es comprobar si los mensajes WM_PAINT pueden llegar mientras aún se está procesando uno anterior

Posted: Fri Sep 14, 2007 9:47 pm
by Carlos Mora
Bueno, tal como habia anticipado, es una tontería. Los amigos de moc.eviflanac me dieron la solución:
"Hola amigos

La solucion es devolver un 0 en el metodo display.

Duerman tranquilos

menos mal. Mi agradecimiento y reconocimiento. Juntos vamos mejor.

Un saludo,

Carlos

Posted: Fri Sep 14, 2007 9:57 pm
by Antonio Linares
Bueno, hemos localizado un ordenador en el que falla.

La prueba anterior no llega a sonar, luego los mensajes WM_PAINT no llegan recursivamente.

Si se desactiva el doble buffer, entonces casi deja de fallar. Lo que esté fallando se incrementa al usar el doble buffer.

Posted: Fri Sep 14, 2007 10:07 pm
by Antonio Linares
Carlos,

En el problema del brush en la ventana principal, devolver un cero no lo soluciona

Posted: Fri Sep 14, 2007 10:28 pm
by Alfredo Arteaga
En realidad no me preocupa, he vivido con eso mas de cinco años. Si algun usuario quejoso me reclama le digo que es problema de su equipo (si le gusta que lo use y si no que busque otra opción).

Pero sería bueno solucionarlo.

Posted: Fri Sep 14, 2007 10:36 pm
by Antonio Linares
Alfredo,

Nos gustaría solucionarlo y ojalá lo consigamos. De todas formas parece que está muy relacionado con la versión de Windows y con la velocidad del ordenador.

En Vista 32 con un Core Duo no hay forma de hacerlo fallar. Y es el mismo EXE que falla en otro ordenador con XP y más lento.

Posted: Fri Sep 14, 2007 10:42 pm
by Francisco Horta
Antonio,
probando el cambio de la clase twindow en el metodo paint persiste el problema

Image

salu2
paco

Posted: Fri Sep 14, 2007 10:48 pm
by Antonio Linares
Comparando Vista con XP, resulta que en Vista no nos envian mensajes WM_PAINT cuando movemos otra ventana por encima de la nuestra. Es algo que han arreglado en Vista: detectan si no ha cambiado la imagen de la ventana y se ahorran de enviar y procesar mensajes WM_PAINT.

En cambio en XP, si nos envian mensajes WM_PAINT cuando movemos otra ventana por encima.

Posted: Sat Sep 15, 2007 7:51 am
by Antonio Linares
Posiblemente estamos tratando dos problemas distintos:

Hemos modificado FWH para que siempre devuelva cero al tratar el mensaje WM_PAINT. Eso debería arreglar el problema de pintado de los controles pero no soluciona el problema del pintado del brush de la ventana principal

Posted: Sat Sep 15, 2007 7:58 am
by Antonio Linares
PROBLEMA SOLUCIONADO:

Efectivamente Paco tenía razón y faltaba ese cero. La cuestión es donde ponerlo correctamente:

En la clase TWindow:

METHOD EndPaint() INLINE ::nPaintCount--,;
EndPaint( ::hWnd, ::cPS ), ::cPS := nil, ::hDC := nil, 0

Observen el cero al final. Problema del brush solucionado! :-)

Posted: Sat Sep 15, 2007 12:43 pm
by A&C
ANTONIO

Hemos modificado FWH para que siempre devuelva cero al tratar el mensaje WM_PAINT. Eso debería arreglar el problema de pintado de los controles

a q te refieres con lo anterior, lo del agregar un CERO a EndPaint como indicaste soluciono el problema,, aunque se genera un pequeño retardo en el pintado,, es como si ese cero agregado relentizara el pintado,, pero no falla .....

a parte de ese CERO hay algun cambio mas ???? como dijiste hemos modificado FWH.... o solo te referias el agregar el cero como indicaste--


GRACIAS

Posted: Sat Sep 15, 2007 1:27 pm
by Antonio Linares
Solo hay que añadir ese cero al final en EndPaint()

Posted: Mon Sep 17, 2007 3:45 pm
by Francisco Horta
Antonio fijate que probe haciendo el cambio de ponerle el cero (el de la sugerencia fue carlos, no yo, jeje) en el endpaint(), y no me va, sigue pintando mal, y aparte me bloquea el sistema completo... asi tengo mi codigo

DEFINE WINDOW oWnd TITLE oVarSys:NomSys MDI MENU MiMenu() ICON oIcon

.......
ACTIVATE WINDOW oWnd MAXIMIZED ;
ON PAINT Showlogo(oWnd, nColor)


Function ShowLogo(oWnd, nColor)
Local oBmp, cFile, _nFil, _nCol, aCoors := GetCoors( GetDesktopWindow() ) // la pos 3 y 4 dan la resolucion de pantalla

cFile := "Fondo1024.jpg"

_nFil := GetWndRect(GetDesktopWindow())[3]
_nCol := GetWndRect(GetDesktopWindow())[4]

If File(cFile)
@ 0,0 Image oBmp OF oWnd:oWndClient ;
NOBORDER PIXEL SIZE _nCol,_nFil
oBmp:LoadImage(,cFile)
oBmp:refresh()
Else
FillWnd( oWnd:oWndClient, nColor )
Endif

return nil

Que estoy haciendo mal?
Gracias
Paco

Posted: Mon Sep 17, 2007 4:01 pm
by Antonio Linares
Paco,

Prueba a no llamar a ShowLogo()

Paco, tu código crea un control cada vez que se pinta la ventana!!!
@ 0,0 Image oBmp ...
Eso jamas se debe hacer

Posted: Mon Sep 17, 2007 6:05 pm
by Francisco Horta
Probare Antonio, voy a cambiar mi codigo para poner la imagen en el area de cliente, aver como adapto eso,
Gracias
Paco