Scroll Box
Scroll Box
Hola foreros
¿ alguien sabe como se cambia el tamaño del Thumb (Scroll Box) de una Scrollbar ?
Gracias
¿ alguien sabe como se cambia el tamaño del Thumb (Scroll Box) de una Scrollbar ?
Gracias
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
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
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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
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.
Gracias de antemano.
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
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
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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
Antolín,
Te agradecería que si consigues cambiar el tamaño del Scrollbar nos lo hagas saber y el como.
Saludos.
Te agradecería que si consigues cambiar el tamaño del Scrollbar nos lo hagas saber y el como.
Saludos.
Re: Scroll Box
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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box (en vía de solucóon)
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.
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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box (en vía de solucóon)
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
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
Scroll Box (SOLUCIONADO)
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++
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).
He empezado por implementar dos funciones en C++
Code: Select all | Expand
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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
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:
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.
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
#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
FWH 2007 - xHarbour - BCC55
Re: Scroll Box
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
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
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
Re: Scroll Box
Tercero: He modificado la clase TScrollBar hasta dejarla así:
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.
Code: Select all | Expand
#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...
FWH 2007 - xHarbour - BCC55
FWH 2007 - xHarbour - BCC55
Scroll Box (SOLUCIONADO)
eN MI ULTIMO PROGRAMA HE IMPLEMENTADO UN scroll ASI:
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.
Code: Select all | Expand
@ ::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
FWH 2007 - xHarbour - BCC55
Scroll Box (SOLUCIONADO)
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
viewtopic.php?f=6&t=29054
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
FWH 2007 - xHarbour - BCC55