FWH - Nueva Clase TOutLook2003

User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Antonio,
probando el cambio de la clase twindow en el metodo paint persiste el problema

Image

salu2
paco
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
A&C
Posts: 214
Joined: Sat Aug 19, 2006 1:37 pm
Location: Chile

Post 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
Mi segundo amor es Programar
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Solo hay que añadir ese cero al final en EndPaint()
regards, saludos

Antonio Linares
www.fivetechsoft.com
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post 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
Post Reply