Page 1 of 1

Comportamiento extraño por el uso de wbrwline.c

Posted: Mon Feb 13, 2006 9:17 am
by tsales
Antonio
En algunas ocasiones he reportado el comportamiento extraño en el repintado de ventanas con color de fondo, cuando otra ventana es movida por encima. Creo haber localizado el problema pero se escapa a mis conocimientos el poderlo solucionar. Proviene del uso de la clase TWbrose de Hernan y concrétamente la línea:

#define _PutSym( _SymEval ) hb_vmPushSymbol( &hb_symEval )

en el fichero "WBRWLINE.C".

Y como muestra un boton:

http://hyperupload.com/download/a680c98 ... 1.JPG.html

En la imagen se aprecian los residuos.

El codigo fuente utilizado es el siguiente, enlazando al mismo tiempo el fichero en "c" al buildx.bat :

echo wbrwline.obj + >> b32.bc
-----------------------------------------------------------------
#include "FiveWin.ch"

static oWnd

function Main()

local oWndEdit, oBar, oIcon, oImage
local cName := "FiveWin power"

DEFINE ICON oIcon RESOURCE "test"

DEFINE WINDOW oWnd FROM 1, 1 TO 20, 70 TITLE "I am the MDI Frame" ;
COLOR "W+/R" ;
ICON oIcon

ACTIVATE WINDOW oWnd MAXIMIZED ;
VALID MsgYesNo( "Want to End ?" )

return nil
---------------------------------------------------------------------------

Saludos

Posted: Mon Feb 13, 2006 10:20 pm
by Antonio Linares
Toni,

En el ejemplo que proporcionas no estás usando el browse.

El problema proviene por una lentitud al procesar todos los mensajes de pintado que envia Windows, debido al uso del pintado a doble buffer.

Si en la Clase TWindow declaras los métodos DispBegin() y DispEnd() como VIRTUAL, entonces desaparecerá el problema, pero no tendrás pintado a doble buffer que elimina muchos parpadeos, pero tiene ese desagradable efecto, debido al tiempo que consume la maquina virtual de la aplicación.

Posted: Tue Feb 14, 2006 7:44 am
by tsales
Antonio Linares wrote:Toni,

En el ejemplo que proporcionas no estás usando el browse.

El problema proviene por una lentitud al procesar todos los mensajes de pintado que envia Windows, debido al uso del pintado a doble buffer.

Si en la Clase TWindow declaras los métodos DispBegin() y DispEnd() como VIRTUAL, entonces desaparecerá el problema, pero no tendrás pintado a doble buffer que elimina muchos parpadeos, pero tiene ese desagradable efecto, debido al tiempo que consume la maquina virtual de la aplicación.
Antonio
El tema es que si comenta la linea que te indico y sin usar el browse el repintado se realiza correctamente. Yo le he probado en 2 equipos diferentes con tarjetas de video + o - rápidas y en _ el comportamiento es identico.
Con el problema del doble buffer se entendería un comporamiento lógico si tardando más, al final, lo repintara correctamente. Lo curioso es que cuando la ventana recibe el foco, esta se queda con los residuos hasta que se fuerza de alguna forma un repintado.

Saludos

Posted: Tue Feb 14, 2006 12:20 pm
by Antonio Linares
Toni,

Es como si se perdiesen mensajes de pintado, ya que si luego redimensionas la ventana ó la maximizas, se pinta correctamente.

Es un problema que comenzó con el pintado a doble buffer y que todavía no sabemos exactamente por qué ocurre.