Problemas con Rpreview

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 9:30 am

Cristobal,

En el ejemplo test2003.prg de la carpeta samples de FWH, se usa MDI y al tener un control TOutLook a la izquierda, se producía un GPF que en ese ejemplo se solucionaba (provisionalmente) de esta forma:

Code: Select all  Expand view
function WinRun()

   while NoGPF()
      if lExit
         PostQuitMessage( 0 )
      endif  
   end
   
return nil        
               
//----------------------------------------------------------------------------//

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

BOOL SysRefresh( void );

HB_FUNC( NOGPF )
{
   __try
   {
      hb_retl( SysRefresh() );
   }
   __except ( ( hb_retl( TRUE ), TRUE ) )
   {}
}
 


Por eso te preguntaba si tu tambien estabas usando la función NoGPF(). De todas formas, y para satisfacción de todos, hoy he "visto" de donde provenía el bug. En FWH source/winapi/mdi.c tenemos:

Code: Select all  Expand view
LRESULT WINAPI _WndFrameProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
   return DefFrameProc( hWnd, GetWindow( hWnd, GW_CHILD ), wMsg, wParam,
                        lParam );
}


y ahí estaba el bug puesto que ese código presupone que el primer control hijo de la ventana principal es la ventana MDIClient. En realidad el código (que parece) correcto es:

Code: Select all  Expand view
LRESULT WINAPI _WndFrameProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
   HWND hWndClient = GetWindow( hWnd, GW_HWNDFIRST );
   char szName[ 20 ];
   
   GetClassName( hWndClient, szName, 19 );
   
   while( hWndClient && strcmp( szName, "MDICLIENT" ) != 0 )
   {
      hWndClient = GetWindow( hWndClient, GW_HWNDNEXT );
      GetClassName( hWndClient, szName, 19 );
   }
       
   return DefFrameProc( hWnd, hWndClient, wMsg, wParam, lParam );
}


Tomando el primer control hijo de la ventana principal, buscamos hasta encontrar la ventana MDIClient y no presuponemos que es la primera. Gracias a este cambio ahora ya se puede eliminar la llamada a la función WinRun() y a NoGPF() desde test2003.prg y aplicaciones similares :-)
regards, saludos

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

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 10:41 am

Cristobal, Pedro,

No es fácil identificar como se arregló ese bug. Me explico:

* No ha habido ningún cambio significativo en rpreview.prg relativo al pintado de esas líneas.
* Esas líneas (son las sombras de las hojas) las dibujan los objetos TMetafile y tampoco ha habido ningún cambio en esa clase.
* Posiblemente lo que ocurre es que los cambios y mejoras en el uso de los brushes han solucionado ese problema, al igual que en otros casos muy diferentes, donde ahora funcionan bien.

Salvo que haya algún código en otra parte que este relacionado con esas líneas y que ahora mismo yo no esté teniendo en cuenta.

Voy a revisar los cambios de la clase Brush, pero estos a su vez estan relacionados con la clase TWindow que tambien ha cambiado bastante. De ahi que no sea fácil localizar el cambio exacto que soluciona ese efecto (parece que falta un repintado, ó que no ha llegado a refrescar como debiera).
regards, saludos

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

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 10:46 am

Una posible solución, fácil de implementar, sería en rpreview.prg:

Code: Select all  Expand view
  ACTIVATE WINDOW ::oWnd MAXIMIZED ;
      ON RESIZE ( ::PaintMeta(), ::Refresh() )
regards, saludos

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

Re: Problemas con Rpreview

Postby cnavarro » Fri Jul 26, 2013 12:07 pm

Antonio:

MDI (NoGPF):
- Voy a probarlo añadiendo la funcion que has puesto en mi codigo a ver como funciona.

PREVIEW:

Quizás el problema pueda estar en el METHOD Zoom( lMenu ) CLASS TPreview

Code: Select all  Expand view


   .../..

   if lMenu .and. ! IsAppThemed()
      ::oZoom:Refresh()
   endif

   ::oWnd:Refresh()  // Fix for clearing shadows when unzoomed .. fwh 11.5
   ::PaintMeta()
   SetResources( hOldRes )

return nil

 


En alguno de los dos Refresh() ( el del oZoom o el de la oWnd )
Lo que me extraña es que yo estoy usando la version 12.03 porque cuando Minimizo y Maximizo desaparecen
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6548
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 12:53 pm

Cristobal,

Al maximizar, redimensionar o minimizar, Windows repinta todo y es equivalente a hacer ::oWnd:Refresh()
regards, saludos

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

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 12:56 pm

Entendido el problema, es mucho mas simple:

Las sombras las estan dibujando los objetos Metafile directamente encima de la ventana contenedora (la principal) por lo que al cambiar de tamaño la ventana principal no hay mas remedio que forzarle su repintado haciendo ::oWnd:Refresh() para que se borre lo dibujado en ella.
regards, saludos

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

Re: Problemas con Rpreview

Postby cnavarro » Fri Jul 26, 2013 12:58 pm

Antonio
Por eso hago el comentario
Deberia de funcionar al hacer el Refresh a la ventana
Solo me queda ya comprobar que el ::oWnd se refiera a la ventana (MDICHILD), y que en entorno NO MDI funcione bien

Gracias
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6548
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 1:00 pm

Cristobal,

::oWnd es la ventana del preview. Siempre será esa:

Code: Select all  Expand view
  if !::oDevice:lPrvModal .and. ::oWndMain != nil .and. ;
      Upper( ::oWndMain:ClassName() ) == "TMDIFRAME"
      DEFINE WINDOW ::oWnd ;
         TITLE cTitle ;
         COLOR CLR_BLACK,CLR_LIGHTGRAY      ;
         ICON  oIcon                        ;
         VSCROLL HSCROLL MDICHILD
   else
      DEFINE WINDOW ::oWnd /*FROM 0, 0 TO 24, 80*/  ;
         TITLE cTitle ;
         COLOR CLR_BLACK,CLR_LIGHTGRAY      ;
         ICON  oIcon                        ;
         VSCROLL HSCROLL MENU ::BuildMenu()
   endif
regards, saludos

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

Re: Problemas con Rpreview

Postby Antonio Linares » Fri Jul 26, 2013 8:31 pm

Y tras el fix en mdiframe ahora podemos completar la funcionalidad de los botones de las ventanas hijas al estar maximizadas:

Code: Select all  Expand view
METHOD Command( nWParam, nLParam ) CLASS TMdiFrame

   local lToolBar := ( GetClassName( nLParam ) == "ToolbarWindow32" )

   if ::oWndActive != nil
      do case
         case nWParam == 61472
              ::oWndActive:Minimize()
           
         case nWParam == 61728
              ::oWndActive:Restore()
           
         case nWParam == 61536
              ::oWndActive:End()
      endcase
   endif  

   ...
 
regards, saludos

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

Re: Problemas con Rpreview

Postby cnavarro » Sun Jul 28, 2013 11:27 am

Antonio
El problema de las lineas negras lo solucione
Era un problema PROPIO al realizar algunas pruebas no refrescaba oWnd
Gracias por todo
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6548
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 47 guests