Scroll Box

Scroll Box

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby hmpaquito » Wed Sep 10, 2014 11:52 am

hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Scroll Box

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby hmpaquito » 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.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Scroll Box

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box (en vía de solucóon)

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box (en vía de solucóon)

Postby cnavarro » Wed Sep 17, 2014 1: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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Scroll Box (SOLUCIONADO)

Postby antolin » Wed Sep 17, 2014 6: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: Select all  Expand view
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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby antolin » Wed Sep 17, 2014 7: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: Select all  Expand view
#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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Scroll Box

Postby cnavarro » Wed Sep 17, 2014 7: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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Scroll Box

Postby antolin » Wed Sep 17, 2014 7:25 pm

Tercero: He modificado la clase TScrollBar hasta dejarla así:
Code: Select all  Expand view
#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, ::oWnd: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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Scroll Box (SOLUCIONADO)

Postby antolin » Wed Sep 17, 2014 7:33 pm

eN MI ULTIMO PROGRAMA HE IMPLEMENTADO UN scroll ASI:
Code: Select all  Expand view
  @ ::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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Scroll Box (SOLUCIONADO)

Postby antolin » Thu Sep 18, 2014 9: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=6&t=29054
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 72 guests