Page 1 of 1

Scroll de controles - un primer prototipo

Posted: Wed Mar 01, 2006 12:02 am
by Antonio Linares
Aqui podeis descargar un ejemplo de scroll de controles:
http://hyperupload.com/download/ed4de01 ... l.zip.html

Image

Posted: Wed Mar 01, 2006 7:41 am
by jlcapel
Antonio,

Estás que te sales!!

Saludos,
José Luis Capel :D

Posted: Wed Mar 01, 2006 7:56 am
by Antonio Linares
Jose Luis,

La cuestión es pensar bien donde implementarlo. Creo que se debe implementar en la clase TWindow, para que cualquier control pueda ser "scrolleable", así podremos tener paneles scrollables ó cajas de diálogo ó páginas de un folder.

Creo que por prioridad lo primero es implementar las cajas de diálogo no modales, luego los folders y finalmente dotar a TWindow de esta capacidad.

Posted: Wed Mar 01, 2006 8:02 am
by Carles
Antonio,

No te olvides la clase TPage(), q en las pocket creo q su uso va a venir muy bien.

Saludos.
C.

Posted: Wed Mar 01, 2006 8:04 am
by Antonio Linares
Carles,

Cierto :)

Posted: Wed Mar 01, 2006 8:08 am
by Antonio Linares
Como aún podemos tardar en tener todo listo, aquí os incluyo el código fuente del ejemplo. Ojo, hay que modificar la clase TSay como se indica y también ScrollWindow():

Code: Select all

#include "FWCE.ch"
 
#define GWL_STYLE        (-16)
#define WS_VSCROLL  0x00200000
  
//----------------------------------------------------------------------------//
 
function Main()
 
   local oWnd, oSay
   local cName := Space( 20 ), cAddress := Space( 30 )

   DEFINE WINDOW oWnd TITLE "Scroll"

   @ 10, 10 SAY oSay PROMPT "" OF oWnd ;
      SIZE oWnd:nWidth() - 18, oWnd:nHeight() - 40;
      PIXEL BORDER COLOR "N/BG*"
 
   @  6, 3.8 SAY "Name:" OF oSay SIZE 40, 15
   
   @  7, 8 GET cName OF oSay SIZE 100, 18

   @  7.8, 2.1 SAY "Address:" OF oSay SIZE 50, 15
   
   @  9, 8 GET cAddress OF oSay SIZE 120, 18
 
   SetWindowLong( oSay:hWnd, GWL_STYLE,;
                  nOr( GetWindowLong( oSay:hWnd, GWL_STYLE ), WS_VSCROLL ) ) 
 
   ACTIVATE WINDOW oWnd
 
return nil
La Clase TSay (estas modificaciones, muy cambiadas, irán a TWindow):

Code: Select all

// FWPPC Class TSay (C) FiveTech Software 2005

#include "FiveWin.ch"
...

CLASS TSay FROM TControl

   ...
   DATA   nStart, nEnd 

   METHOD VScroll( nWParam, nLParam )
   ...

METHOD New( ... ) CLASS TSay

   ...

   ::nStart = 0
   ::nEnd   = -1000

return Self

...

METHOD VScroll( nWParam, nLParam ) CLASS TSay

   local nScrollCode := nLoWord( nWParam )

   do case
   		case nScrollCode == SB_LINEUP
   		     if ::nStart < 0
              ScrollWindow( ::hWnd, 0, 10 )
              ::nStart += 10
           endif   

   		case nScrollCode == SB_LINEDOWN
           if ::nStart > ::nEnd 
              ScrollWindow( ::hWnd, 0, -10 )
              ::nStart -= 10
           endif   
   endcase    		 

return 0   
y finalmente ScrollWindow() queda así:

Code: Select all

BOOL ScrollWindow( HWND hWnd,	int XAmount, int YAmount,	CONST RECT *lpRect,
                   CONST RECT *lpClipRect )
{
   return ScrollWindowEx( hWnd,	XAmount, YAmount, lpRect, lpClipRect, NULL, NULL, SW_ERASE | SW_SCROLLCHILDREN );
}