FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Scroll Box
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Scroll Box
Posted: Wed Sep 10, 2014 11:12 AM

Hola foreros

¿ alguien sabe como se cambia el tamaño del Thumb (Scroll Box) de una Scrollbar ?

Gracias

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Scroll Box
Posted: Wed Sep 10, 2014 11:52 AM
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Wed Sep 10, 2014 12:18 PM

Está muy bien, pero parece que tocando el Registro me va a producir cambios permanentes.

Yo tan solo quiero cambiar el tamaño del Thumb Box en función del tamaño del array listado. Si le añado elementos al array, disminuye de tamaño y si borro elementos aumenta. No quiero estar tocando el registro a cada vez. Sólo quiero acceder a la estructura SCROLLBARINFO de mi Scroll para modificar algún dato.

Gracias de todas formas

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Wed Sep 10, 2014 12:20 PM

Lo que pasa es que en C estoy ,muy verde. Se que haciendo muchas pruebas conseguiré acceder a esa estructura, pero a lo mejor alguien ya tiene la solución y me ahorra días de trabajo.

Gracias de antemano.

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Wed Sep 10, 2014 12:31 PM

Mi pregunta, ahora es: Si consigo, desde C, el puntero al SCROLLBARINFO de mi Objeto oScroll, y lo guardo en oScroll:Cargo. Podré mandar ese puntero a otra función C para cambiar algún dato de la estructura. Y si consigo, por ejemplo, cambiar dxyLineButton, ya afecta directamente al Scroll para el siguiente PAINT o hace falta implementar algún SetScrollBarInfo especial?

Ya que oScroll:Cargo tiene la dirección de la estructura SCROLLBARINFO correspondiente, ¿podría cambiar algún dato de la misma sin llamar a C, por ejemplo haciendo oScroll:Cargo[1] := xxx? ¿Cómo se haría?

Gracias

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Scroll Box
Posted: Wed Sep 10, 2014 12:38 PM

Antolín,

Te agradecería que si consigues cambiar el tamaño del Scrollbar nos lo hagas saber y el como.

Saludos.

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Sat Sep 13, 2014 11:20 AM

A lo mejor me he explicado mal. En mis Scrolls, el Thumb tiene siempre el mismo tamaño (un cuadrado). Lo que necesito es que el tamaño del Thumb Varie srgún la cantidad de datos listados, como cualquier listbox. Tengo la impresión que sólo es cuestión de encontrar el parámetro de estilo correcto.

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box (en vía de solucóon)
Posted: Wed Sep 17, 2014 11:15 AM

Hola, parece que este tema no interesa a mucha gente. Bueno de todas formas seguiré con el por si hay alguien a quien sí interese.

Creo que he encontrado la solución en esta página:

http://winapi.conclase.net/curso/index. ... 012#inicio

Dice que los scrolls antiguos utilizaban SetScrollRange() para posicionarse, como en mi FWH, y que desde hace mucho tiempo se utiliza SetScrollRange() basado en la estructura SCROLLINFO. Así que voy a probarlo, y si a alguien le interesa expondré aquí mis resultados.

Saludos.

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Scroll Box (en vía de solucóon)
Posted: Wed Sep 17, 2014 01:29 PM
antolin wrote:Hola, parece que este tema no interesa a mucha gente. Bueno de todas formas seguiré con el por si hay alguien a quien sí interese.

Creo que he encontrado la solución en esta página:

http://winapi.conclase.net/curso/index. ... 012#inicio

Dice que los scrolls antiguos utilizaban SetScrollRange() para posicionarse, como en mi FWH, y que desde hace mucho tiempo se utiliza SetScrollRange() basado en la estructura SCROLLINFO. Así que voy a probarlo, y si a alguien le interesa expondré aquí mis resultados.

Saludos.


Estaré muy pendiente de tus avances.
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: 498
Joined: Thu May 10, 2007 08:30 PM
Scroll Box (SOLUCIONADO)
Posted: Wed Sep 17, 2014 06:57 PM
Bueno amigo, al fin lo he conseguido. Esto es lo que he tenido que hacer (por cierto, como esto va a ser un poco largo, lo voy a comentar en varios post seguidos).

He empezado por implementar dos funciones en C++
Code (fw): Select all Collapse
HB_FUNC( SETINFOSCROLL )  //  SetInfoScroll(HWND hWnd, int nPos, int nMin, int nMax, int nPage, int nFlag, BOOL nReDraw )
   {
   SCROLLINFO si ;

   ZeroMemory(&si, sizeof(SCROLLINFO)) ;

   si.cbSize = sizeof(SCROLLINFO) ;
   si.fMask  = SIF_ALL ;
   si.nPos   = (int) hb_parni( 2 ) ;
   si.nMin   = (int) hb_parni( 3 ) ;
   si.nMax   = (int) hb_parni( 4 ) ;
   si.nPage  = (int) hb_parni( 5 ) ;

   hb_retni( SetScrollInfo( (HWND) hb_parnl( 1 ), hb_parni( 6 ), &si, hb_parl( 7 ) ) ) ;
   }

HB_FUNC( SETINFORANGE ) // SetInfoRange(HWND hWnd, int nMin, int nMax, int nFlag, BOOL lReDraw)
   {
   SCROLLINFO si ;

   ZeroMemory(&si, sizeof(SCROLLINFO)) ;

   si.cbSize = sizeof(SCROLLINFO) ;
   si.fMask  = SIF_RANGE ;
   si.nMin   = (int) hb_parni( 2 ) ;
   si.nMax   = (int) hb_parni( 3 ) ;

   hb_retni( SetScrollInfo( (HWND) hb_parnl( 1 ), hb_parni( 4 ), &si, hb_parl( 5 ) ) ) ;
   }

Las he llamado así por darle un nombre que ya no exista en las librerías de FWH, pero podéis darle el nombre que creáis más adecuado.

La primera es para inicializar el SCROLL, supongo que le crea una estructura SCROLLINFO que después habrá que manipular para cambiar el RANGE. La segunda es para cambiar el RANGE del SCROLL sobre la marcha (va de narices).
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Wed Sep 17, 2014 07:12 PM
Segundo: he añadido el DATA lThumbResize a la clase TScrollBar. Cuando esté en .T. se podrá redimensionar el THUMB (o SCROLL BOX), y si está en .F. seguirá como antes. A partir de ahora, para Browses de Bases de datos lo dejaré en .F. y para todo lo demás lo pondré en .T.

Para no tener que modificar inicialmentete mis antiguas aplicaciones ::lThumbResize valdrá .F. por defecto.

Como hay que inicializar el SCROLL en el momento de su creación, para recursos hay que poner SetInfoScroll() en el método INITIATE (que no existe y hay que crearlo como explicaré después) pero para los demás casos hay que ponerlo en el NEW() y en el WinNew(). Significa que hay que inicializar lThumbResize antes que el PAINT, por lo que hay que llamarlo desde Fivewin.ch, significa que he tenido que modificarlo asi:
Code (fw): Select all Collapse
#xcommand @ <nRow>, <nCol> SCROLLBAR [ <oSbr> ] ;
             [ <h: HORIZONTAL> ] ;
             [ <v: VERTICAL> ] ;
             [ RANGE <nMin>, <nMax> ] ;
             [ PAGESTEP <nPgStep> ] ;
             [ SIZE <nWidth>, <nHeight> ] ;
             [ <up:UP, ON UP> <uUpAction> ] ;
             [ <dn:DOWN, ON DOWN> <uDownAction> ] ;
             [ <pgup:PAGEUP, ON PAGEUP> <uPgUpAction> ] ;
             [ <pgdn:PAGEDOWN, ON PAGEDOWN> <uPgDownAction> ] ;
             [ <pos: ON THUMBPOS> <uPos> ] ;
             [ <pixel: PIXEL> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ OF <oWnd> ] ;
             [ MESSAGE <cMsg> ] ;
             [ <update: UPDATE> ] ;
             [ WHEN <uWhen> ] ;
             [ VALID <uValid> ] ;
             [ <lDesign: DESIGN> ] ;
             [ <lThumb: THUMB> ] ;  // <----- NUEVA VARIABLE LOGICA
       => ;
          [ <oSbr> := ] TScrollBar():New( <nRow>, <nCol>, <nMin>, <nMax>, <nPgStep>,;
             (.not.<.h.>) [.or. <.v.> ], <oWnd>, <nWidth>, <nHeight> ,;
             [<{uUpAction}>], [<{uDownAction}>], [<{uPgUpAction}>], ;
             [<{uPgDownAction}>], [\{|nPos| <uPos> \}], [<.pixel.>],;
             <nClrText>, <nClrBack>, <cMsg>, <.update.>, <{uWhen}>, <{uValid}>,;
             <.lDesign.>, [color=#FF0000]<.lThumb.> [/color])

// for 'non-true ScrollBars' ( when using WS_VSCROLL or WS_HSCROLL styles )

#xcommand DEFINE SCROLLBAR [ <oSbr> ] ;
             [ <h: HORIZONTAL> ] ;
             [ <v: VERTICAL> ] ;
             [ RANGE <nMin>, <nMax> ] ;
             [ PAGESTEP <nPgStep> ] ;
             [ <up:UP, ON UP> <uUpAction> ] ;
             [ <dn:DOWN, ON DOWN> <uDownAction> ] ;
             [ <pgup:PAGEUP, ON PAGEUP> <uPgUpAction> ] ;
             [ <pgdn:PAGEDOWN, ON PAGEDOWN> <uPgDownAction> ] ;
             [ <pos: ON THUMBPOS> <uPos> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ <of: OF, WINDOW, DIALOG> <oWnd> ] ;
             [ MESSAGE <cMsg> ] ;
             [ <update: UPDATE> ] ;
             [ WHEN <uWhen> ] ;
             [ VALID <uValid> ] ;
             [ <lThumb: THUMB> ] ;  // <----- NUEVA VARIABLE LOGICA
       => ;
             [ <oSbr> := ] TScrollBar():WinNew( <nMin>, <nMax>, <nPgStep>, ;
             (.not.<.h.>) [.or. <.v.> ], <oWnd>, [<{uUpAction}>],;
             [<{uDownAction}>], [<{uPgUpAction}>], ;
             [<{uPgDownAction}>], [\{|nPos| <uPos> \}],;
             <nClrText>, <nClrBack>, <cMsg>, <.update.>, <{uWhen}>, <{uValid}>, [color=#FF0000]<.lThumb.> [/color])

#xcommand REDEFINE SCROLLBAR [ <oSbr> ] ;
             [ ID <nID>  ] ;
             [ RANGE <nMin>, <nMax> ] ;
             [ PAGESTEP <nPgStep> ] ;
             [ <up:UP, ON UP, ON LEFT> <uUpAction> ] ;
             [ <dn:DOWN, ON DOWN, ON RIGHT> <uDownAction> ] ;
             [ <pgup:PAGEUP, ON PAGEUP> <uPgUpAction> ] ;
             [ <pgdn:PAGEDOWN, ON PAGEDOWN> <uPgDownAction> ] ;
             [ <pos: ON THUMBPOS> <uPos> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ OF <oDlg> ] ;
             [ MESSAGE <cMsg> ] ;
             [ <update: UPDATE> ] ;
             [ WHEN <uWhen> ] ;
             [ VALID <uValid> ] ;
             [ <lThumb: THUMB> ] ;  // <----- NUEVA VARIABLE LOGICA
       => ;
          [ <oSbr> := ] TScrollBar():Redefine( <nID>, <nMin>, <nMax>, <nPgStep>,;
            <oDlg>, [<{uUpAction}>], [<{uDownAction}>], [<{uPgUpAction}>], ;
            [<{uPgDownAction}>], [\{|nPos| <uPos> \}], <nClrText>,;
            <nClrBack>, <cMsg>, <.update.>, <{uWhen}>, <{uValid}>, [color=#FF0000]<.lThumb.> [/color])

Como antes, le he puesto los nombres a los DATAS y las variables a mi parecer y comodidad, seguramente le encontrareis otros más adecuados.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Scroll Box
Posted: Wed Sep 17, 2014 07:15 PM

Antolin, gracias por compartir
Por cierto, si te es posible, además de tus estupendas explicaciones, adjunta los ejemplos que has realizado para su prueba

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: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Scroll Box
Posted: Wed Sep 17, 2014 07:25 PM
Tercero: He modificado la clase TScrollBar hasta dejarla así:
Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "Constant.ch"

#define SB_HORZ         0
#define SB_VERT         1
#define SB_CTL          2

#ifdef __XPP__
   #define Super ::TControl
   #define New _New
#endif

//----------------------------------------------------------------------------//

CLASS TScrollBar FROM TControl

   DATA   lVertical, lReDraw, lIsChild, nMin, nMax, nPgStep
   DATA   bGoUp, bGoDown, bGoTop, bGoBottom, bPageUp, bPageDown, bPos
   DATA   bTrack, bWheel
   DATA   hCDC, lThumbResize // NUEVO DATA


   CLASSDATA aProperties INIT { "cVarName", "nMin", "nMax",;
                                "nPgStep", "nTop", "nLeft", "Cargo", "lVertical" }

   METHOD New( nRow, nCol, nMin, nMax, nPgStep, lVertical, oWnd, nWidth,;
               nHeight, bUpAction, bDownAction, bPgUp, bPgDown,;
               bPos, lPixel, nClrText, nClrBack, cMsg, lUpdate,;
               bWhen, bValid, lDesign, lThumb ) CONSTRUCTOR

   METHOD WinNew( nMin, nMax, nPgStep, lVertical, oWnd, bUpAction,;
                  bDownAction, bPgUp, bPgDown, bPos, nClrText, nClrBack,;
                  lUpdate, bWhen, bValid, lThumb ) CONSTRUCTOR

   METHOD ReDefine( nID, nMin, nMax, nPgStep, oWnd, bUpAction, bDownAction, ;
                    bPgUp, bPgDown, bPos, nClrText, nClrBack, cMsg,;
                    lUpdate, bWhen, bValid, lThumb ) CONSTRUCTOR

   METHOD Initiate( hDlg )  // METODO AÑADIDO

   METHOD Default()   // METODO AÑADIDO

   METHOD Paint()

   METHOD cToChar() INLINE Super:cToChar( "SCROLLBAR" )

   METHOD GetPos() INLINE GetScrollPos( If( ::lIsChild, ::oWnd:hWnd, ::hWnd ),;
            If( ::lIsChild, If( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ) )

   METHOD GetRange() INLINE GetScrollRange( If( ::lIsChild, ::oWnd:hWnd, ::hWnd ),;
            If( ::lIsChild, If( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ) )

   METHOD HandleEvent( nMsg, nWParam, nLParam )

   METHOD Initiate( hDlg ) INLINE  Super:Initiate( hDlg ), ;
                               ::SetRange( ::nMin, ::nMax ),;
                               ::SetPos( ::nMin )

   // These two have to be BLOCK

   METHOD GoUp()   BLOCK { | Self, nPos | nPos := ::GetPos(),;
                                          if( nPos > ::nMin,;
                                              ::SetPos( --nPos ), ),;
                          If( ::bGoUp != nil, Eval( ::bGoUp ),) }

   METHOD GoDown() BLOCK { | Self, nPos | nPos := ::GetPos(),;
                                          if( nPos < ::nMax,;
                                              ::SetPos( ++nPos ), ),;
                          If( ::bGoDown != nil, Eval( ::bGoDown ),) }


   METHOD GoTop() INLINE  ::SetPos( ::nMin ),;
                          If( ::bGoTop != nil, Eval( ::bGoTop ),)

   METHOD GoBottom() INLINE  ::SetPos( ::nMax ),;
                             If( ::bGoBottom != nil, Eval( ::bGoBottom ),)

   METHOD PageUp() INLINE  If( ::bPageUp != nil, Eval( ::bPageUp ),),;
                           ::SetPos( ::GetPos() - ::nPgStep )

   METHOD PageDown() INLINE  If( ::bPageDown != nil, Eval( ::bPageDown ),),;
                                 ::SetPos( ::GetPos() + ::nPgStep )

   METHOD SetPage( nSize )

   METHOD SetPos( nPos ) INLINE ;
                 SetScrollPos( if( ::lIsChild, ::oWnd:hWnd, ::hWnd ),;
                 If( ::lIsChild, If( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ),;
                 nPos, ::lReDraw )

   METHOD SetRange( nMin, nMax )  // <--- METODO MODIFICADO

   METHOD ThumbPos( nPos ) INLINE  If( ::bPos != nil, Eval( ::bPos, nPos ),)

   METHOD MouseMove( nRow, nCol, nKeyFlags )

   METHOD ThumbTrack( nPos ) INLINE If( ::bTrack != nil, Eval( ::bTrack, nPos ),)

   METHOD MouseWheel(nKeys,nDelta,nXPos,nYPos)

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nRow, nCol, nMin, nMax, nPgStep, lVertical, oWnd, nWidth, nHeight,;
            bUpAct, bDownAct, bPgUp, bPgDown, bPos, lPixel, nClrText,;
            nClrBack, cMsg, lUpdate, bWhen, bValid, lDesign, lThumb ) CLASS TScrollBar

   #ifdef __XPP__
      #undef New
   #endif

   DEFAULT nRow := 0, nCol := 0,;
           nMin := 0, nMax := 0, nPgStep := 1,;
           oWnd := GetWndDefault(),;
           lVertical := .t., nWidth := If( lVertical, 16, 100 ),;
           nHeight   := If( lVertical, 100, 17 ),;
           lPixel    := .f.,;
           nClrText  := GetSysColor( COLOR_WINDOW ),;
           nClrBack  := GetSysColor( COLOR_SCROLLBAR ),;
           lUpdate   := .f., lDesign := .f., ;
           lThumb := .F.

   ::cCaption   = ""
   ::nTop       = nRow * If( lPixel, 1, SCRL_CHARPIX_H )    //14
   ::nLeft      = nCol * If( lPixel, 1, SCRL_CHARPIX_W )    // 8
   ::nBottom    = ::nTop + nHeight - 1
   ::nRight     = ::nLeft + nWidth - 1
   ::nMin       = nMin
   ::nMax       = nMax
   ::nPgStep    = nPgStep
   ::lVertical  = lVertical
   ::lReDraw    = .T.
   ::nStyle     = nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP,;
                       If( lVertical, SBS_VERT, SBS_HORZ ),;
                       If( lDesign, WS_CLIPSIBLINGS, 0 ) )
   ::bGoUp      = bUpAct
   ::bGoDown    = bDownAct
   ::bPageUp    = bPgUp
   ::bPageDown  = bPgDown
   ::bPos       = bPos
   ::oWnd       = oWnd
   ::lIsChild   = .F.
   ::lDrag      = lDesign
   ::lCaptured  = .F.
   ::cMsg       = cMsg
   ::lUpdate    = lUpdate
   ::bWhen      = bWhen
   ::bValid     = bValid

   ::lThumbResize := lThumb  // NUEVO DATA

   ::SetColor( nClrText, nClrBack )

   IF !Empty( oWnd:hWnd )
      ::Create( "SCROLLBAR" )

      ::Default()   // <----------- PARA REDIMENSIONAR EL THUMB

      ::SetRange( ::nMin, ::nMax )
      ::SetPos( ::nMin )

      oWnd:AddControl( Self )
   ELSE
      oWnd:DefControl( Self )
   ENDIF

   IF lDesign
      ::CheckDots()
   ENDIF

RETURN Self

//---------------------------------------------------------------------------//

// Constructor for non-true ScrollBar Controls
// ( when using WS_VSCROLL, WS_HSCROLL styles in a Window )
// They are NOT controls but we consider them as real Objects!

METHOD WinNew( nMin, nMax, nPgStep, lVertical, oWnd, bUpAction,;
               bDownAction, bPgUp, bPgDown, bPos, nClrText, nClrBack,;
               lUpdate, bWhen, bValid, lThumb ) CLASS TScrollBar

   DEFAULT nMin := 1, nMax := 2, nPgStep := 1, lVertical := .t.,;
           nClrText  := GetSysColor( COLOR_WINDOW ),;
           nClrBack  := GetSysColor( COLOR_SCROLLBAR ),;
           oWnd := GetWndDefault(), lUpdate   := .f., ;
           lThumb := .F.

   ::oWnd      = oWnd
   ::lVertical = lVertical
   ::lReDraw   = .t.
   ::lIsChild  = .t.
   ::nMin      = nMin
   ::nMax      = nMax
   ::nPgStep   = nPgStep
   ::bGoUp     = bUpAction
   ::bGoDown   = bDownAction
   ::bPageUp   = bPgUp
   ::bPageDown = bPgDown
   ::bPos      = bPos
   ::lUpdate   = lUpdate
   ::bWhen     = bWhen
   ::bValid    = bValid
   ::hWnd      = 0

   ::lThumbResize := lThumb  // NUEVO DATA

   ::SetRange( nMin, nMax )
   ::SetPos( nMin )

   ::Default()   // <----------- PARA REDIMENSIONAR EL THUMB


RETURN Self

//----------------------------------------------------------------------------//

METHOD Redefine( nID, nMin, nMax, nPgStep, oWnd, bUpAction, bDownAction, ;
                 bPgUp, bPgDown, bPos, nClrText, nClrBack, cMsg,;
                 lUpdate, bWhen, bValid, lThumb ) CLASS TScrollbar

   DEFAULT nMin := 0, nMax := 0, nPgStep := 1,;
           nClrText  := GetSysColor( COLOR_WINDOW ),;
           nClrBack  := GetSysColor( COLOR_SCROLLBAR ),;
           oWnd := GetWndDefault(), lUpdate   := .f., ;
           lThumb := .F.   // <---------------------- DEFECTO .F. POR COMPATIBILIDAD

   ::nID        = nID
   ::nMin       = nMin
   ::nMax       = nMax
   ::nPgStep    = nPgStep
   ::lVertical  = .f.
   ::lReDraw    = .t.
   ::bGoUp      = bUpAction
   ::bGoDown    = bDownAction
   ::bPageUp    = bPgUp
   ::bPageDown  = bPgDown
   ::bPos       = bPos
   ::oWnd       = oWnd
   ::lIsChild   = .f. // .t. only for Windows with WS_HSCROLL ¢ WS_VSCROLL style
   ::lRedraw    = .t.
   ::oWnd       = oWnd
   ::lDrag      = .f.
   ::lCaptured  = .f.
   ::cMsg       = cMsg
   ::lUpdate    = lUpdate
   ::bWhen      = bWhen
   ::bValid     = bValid

   ::lThumbResize := lThumb  // NUEVO DATA

   ::SetColor( nClrText, nClrBack )
   oWnd:DefControl( Self )

RETURN Self

METHOD Initiate( hDlg )  CLASS TScrollBar  // <--- METODO AÑADIDO
   Super:Initiate( hDlg )
   IF ::hWnd # 0
      ::Default()
   ENDIF
RETURN NIL

METHOD Default() CLASS TScrollBar  // <--- METODO AÑADIDO
   LOCAL hWnd  := IF( ::lIsChild, ::oWnd:hWnd, ::hWnd )
   LOCAL nFlag := IF( ::lIsChild, IF( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL )
   *
   IF ::lThumbResize
      SetInfoScroll( hWnd , ::nMin, ::nMin, ::nMax, ::nPgStep, nFlag, .T. )
   ENDIF
RETURN NIL

METHOD Paint()  CLASS TScrollBar
   IF ::hCDC = NIL
      CallWindowProc( ::nOldProc, ::hWnd, WM_PAINT, ::hDc, 0 )
   ELSE
      CallWindowProc( ::nOldProc, ::hWnd, WM_PAINT, ::hCDC,0 )
   ENDIF
RETURN 1

METHOD MouseWheel(nKeys,nDelta,nXPos,nYPos)  CLASS TScrollBar
   IF ::bWheel # NIL
      EVAL(::bWheel,nDelta)
   ELSEIF nDelta > 0
      ::GoUp()
   ELSE
      ::GoDown()
   ENDIF
RETURN NIL

//----------------------------------------------------------------------------//

METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TScrollBar

   DO CASE
      CASE nMsg == FM_SCROLLUP
           ::GoUp()
           RETURN 0

      CASE nMsg == FM_SCROLLDOWN
           ::GoDown()
           RETURN 0

      CASE nMsg == FM_SCROLLPGUP
           ::PageUp()
           RETURN 0

      CASE nMsg == FM_SCROLLPGDN
           ::PageDown()
           RETURN 0

      CASE nMsg == FM_THUMBPOS
           ::ThumbPos( nWParam )
           RETURN 0

      CASE nMsg == FM_THUMBTRACK
           ::ThumbTrack( nWParam )
           RETURN 0
   ENDCASE

RETURN Super:HandleEvent( nMsg, nWParam, nLParam )

//----------------------------------------------------------------------------//

METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TScrollBar
   IF nRow > 32768
      nRow -= 65535
   ENDIF
   IF nCol > 32768
      nCol -= 65535
   ENDIF
   *
   IF ::oCursor # NIL
      SetCursor( ::oCursor:hCursor )
   ELSE
      CursorHand()
   ENDIF
   *
   ::SetMsg( ::cMsg )
   *
   IF ::OnMouseMove != nil
      Eval( ::OnMouseMove, Self, nRow, nCol, nKeyFlags )
   ENDIF
   IF ::bMMoved != nil
      RETURN Eval( ::bMMoved, nRow, nCol, nKeyFlags )
   ENDIF
RETURN NIL

//----------------------------------------------------------------------------//

METHOD SetRange( nMin, nMax ) CLASS TScrollBar  // <--- METODO MODIFICADO
   LOCAL hWnd  := IF( ::lIsChild, ::oWnd:hWnd, ::hWnd )
   LOCAL nFlag := IF( ::lIsChild, IF( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL )
   *
   ::nMin := nMin
   ::nMax := nMax
   *
   IF ::lThumbResize
      SetInfoRange( hWnd, nMin, nMax, nFlag, ::lReDraw )    // METODO NUEVO 
   ELSE
      SetScrollRange( hWnd, nFlag, nMin, nMax, ::lReDraw )  // METODO ANTIGUO
   ENDIF
RETURN NIL

//----------------------------------------------------------------------------//

METHOD SetPage( nSize, lReDraw ) CLASS TScrollBar

/*
   LOCAL nFlags

   DEFAULT lRedraw := .f.

   IF !Empty( ::hWnd )
      nFlags = SB_CTL
   ELSE
      IF ::lVertical
         nFlags = SB_VERT
      ELSE
         nFlags = SB_HORZ
      ENDIF
   ENDIF
   SetScrollInfo( If( ! Empty( ::hWnd ), ::hWnd, ::hWnd ),;
                  nFlags, nSize, lReDraw )
*/

RETURN NIL


Podéis tomarla como referencia para modificar la vuestra propia, que es posible que no sea exactamente igual que la mía, pues mi versión de FWH es del 2007.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Scroll Box (SOLUCIONADO)
Posted: Wed Sep 17, 2014 07:33 PM
eN MI ULTIMO PROGRAMA HE IMPLEMENTADO UN scroll ASI:
Code (fw): Select all Collapse
   @ ::nWidthPen,::nFoldWidth+::nWidthPen+1 SCROLLBAR ::oVScroll1 OF Self ;
       SIZE ::nWidthScr,::nFoldHeight+2 PIXEL THUMB ;
       RANGE 0, ::FdLen()*::nHighFdLin PAGESTEP ::nFoldHeight VERTICAL
   ::bVScroll1  := { || ::oVScroll1:SetPos(::nFoldLin) }
   ::oVScroll1:OnMouseMove := { || ReleaseCapture(),::nFocus := 1 }
   ::oVScroll1:bEraseBkGnd := { || NIL }
   ::oVScroll1:lReDraw := lPaint

Y funciona de maravilla.

Solo hay que tener en cuenta un pequeño detalle. El RANGE del nuevo método funcona de manera ligeramente diferente al del antiguo.

Antes definía el RANGE por la cantidad de información que no estaba a la vista. Por ejemplo si tenía que listar 100 líneas y sólo se ven 20 en pantalla hacía RANGE 1,80 porque de las 100 líneas hay 80 escondidas que son las que hay que scrollar. Con el método nuevo hay que poner RANGE 1,100 porque calcula nMax en función del nPage que tiene que ser 20 (en ambos ) casos. Por lo demás no he tenido que modificar nada más en mi programa.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Scroll Box (SOLUCIONADO)
Posted: Thu Sep 18, 2014 09:04 AM

Me faltaba por decir que el DATA hCDC y el método PAINT de mi clase TScrollBar es fruto de otra de mis investigaciones,que no tiene nada que ver con lo que aquí se trataba. Está explicado en el siguiente hilo:

viewtopic.php?f=6t=29054

&

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55