FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problemas con Rpreview
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: Fri Jul 26, 2013 09: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 (fw): Select all Collapse
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: 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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: Fri Jul 26, 2013 10:46 AM
Una posible soluci贸n, f谩cil de implementar, ser铆a en rpreview.prg:

Code (fw): Select all Collapse
 聽 ACTIVATE WINDOW ::oWnd MAXIMIZED ;
聽 聽 聽 ON RESIZE ( ::PaintMeta(), ::Refresh() )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problemas con Rpreview
Posted: 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 (fw): Select all Collapse
聽 聽.../..

聽 聽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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: 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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: 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
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problemas con Rpreview
Posted: 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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: Fri Jul 26, 2013 01:00 PM
Cristobal,

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

Code (fw): Select all Collapse
   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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problemas con Rpreview
Posted: Fri Jul 26, 2013 08:31 PM
Y tras el fix en mdiframe ahora podemos completar la funcionalidad de los botones de las ventanas hijas al estar maximizadas:

Code (fw): Select all Collapse
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
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problemas con Rpreview
Posted: 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

Continue the discussion