FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ajuste de scroll en explorer bar
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Ajuste de scroll en explorer bar
Posted: Mon Dec 29, 2025 04:07 PM

Hemos detectado que la clase TExplorerBar tiene problemas con el desplazamiento del scroll, cuando se hace clic sobre la barra del scroll y se sostiene el botón izquierdo del mouse, al desplazarnos de arriba a abajo, algunos de los títulos de las barras se desaparecen, como lo muestra la imagen, (para aclarar si funciona correctamente si se hace clic sobre las pequeñas flechas de subir y bajar). De paso también me gustaría solicitar que se agregara el desplazamiento de arriba / abajo, usando la rueda de arrastre del mouse.

explbar4.prg

#include "FiveWin.ch"

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

function Main()

   local oWnd, oExBar, oPanel1, oPanel2, oPanel3, oPanel4
   local bClick := { | o | MsgInfo( o:GetText() ) }
      

   DEFINE WINDOW oWnd TITLE "FWH Class TExplorerBar"
   

   oWnd:SetSize( 350, 600 )

   oExBar = TExplorerBar():New()

   oPanel1 = oExBar:AddPanel( "Uno" )
   oPanel1:lSpecial = .T.
   oPanel1:AddLink( "enero" )
   oPanel1:AddLink( "febrero" )
   oPanel1:AddLink( "marzo" )
   oPanel1:AddLink( "abril" )
   oPanel1:AddLink( "marzo" )
   oPanel1:AddLink( "abril" )
   oPanel1:AddLink( "mayo" )
   oPanel1:AddLink( "junio" )
   oPanel1:AddLink( "julio" )
   oPanel1:AddLink( "agosto" )
   oPanel1:AddLink( "septiembre" )
   oPanel1:AddLink( "octubre" )
   oPanel1:AddLink( "noviembre" )
   oPanel1:AddLink( "diciembre" )
      

   oPanel2 = oExBar:AddPanel( "Dos" )
   oPanel2:AddLink( "enero" )
   oPanel2:AddLink( "febrero" )
   oPanel2:AddLink( "marzo" )
   oPanel2:AddLink( "abril" )
   oPanel2:AddLink( "marzo" )
   oPanel2:AddLink( "abril" )
   oPanel2:AddLink( "mayo" )
   oPanel2:AddLink( "junio" )
   oPanel2:AddLink( "julio" )
   oPanel2:AddLink( "agosto" )
   oPanel2:AddLink( "septiembre" )
   oPanel2:AddLink( "octubre" )
   oPanel2:AddLink( "noviembre" )
   oPanel2:AddLink( "diciembre" )

   oPanel3 = oExBar:AddPanel( "Tres" )
   oPanel3:AddLink( "enero" )
   oPanel3:AddLink( "febrero" )
   oPanel3:AddLink( "marzo" )
   oPanel3:AddLink( "abril" )
   oPanel3:AddLink( "marzo" )
   oPanel3:AddLink( "abril" )
   oPanel3:AddLink( "mayo" )
   oPanel3:AddLink( "junio" )
   oPanel3:AddLink( "julio" )
   oPanel3:AddLink( "agosto" )
   oPanel3:AddLink( "septiembre" )
   oPanel3:AddLink( "octubre" )
   oPanel3:AddLink( "noviembre" )
   oPanel3:AddLink( "diciembre" )

   oWnd:oClient = oExBar

   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: Ajuste de scroll en explorer bar
Posted: Mon Dec 29, 2025 04:15 PM

You sample doesn't show any problems here.

Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Ajuste de scroll en explorer bar
Posted: Mon Dec 29, 2025 05:28 PM

Enrico gracias por responder

Por eso subí la imagen, para mostrar cual es el error. Y también te funciona el desplazamiento con la rueda del ratón?

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: Ajuste de scroll en explorer bar
Posted: Mon Dec 29, 2025 05:39 PM

No, the mouse wheel doesn't work.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ajuste de scroll en explorer bar
Posted: Tue Dec 30, 2025 04:11 AM

Análisis del soporte de rueda del ratón en TExplorerBar

La clase TExplorerBar no tiene soporte nativo para la rueda del ratón 0-cite-0 . La clase define scrollbars verticales y métodos de scroll, pero no implementa el manejo del evento bMouseWheel<cite />.

Cómo implementar el soporte

Para agregar soporte de rueda del ratón, debes asignar el codeblock bMouseWheel en el método constructor New() de la clase, similar a como lo hace TXBrowse 0-cite-1 .

Aquí está la implementación recomendada basada en el patrón usado en otros controles del framework:

Code (harbour): Select all Collapse
METHOD New( nTop, nLeft, nWidth, nHeight, oWnd, nClrFore, nClrBack, oBrush, ;
            l2007, l2010, l2013, l2015 ) CLASS TExplorerBar

   // ... código existente ...

   DEFINE SCROLLBAR ::oVScroll VERTICAL OF Self

   ::oVScroll:bGoUp     = {|| ::VScrollSkip( - 10 ) }
   ::oVScroll:bGoDown   = {|| ::VScrollSkip( 10 ) }
   ::oVScroll:bPageUp   = {|| ::VScrollSkip( - ::oVScroll:nPgStep ) }
   ::oVScroll:bPageDown = {|| ::VScrollSkip( ::oVScroll:nPgStep ) }
   ::oVScroll:bPos      = {|nPos| ::VScrollSetPos( nPos ) }
   ::oVScroll:bTrack    = {|nPos| ::VScrollSetPos( nPos ) }

   // AGREGAR ESTA LÍNEA:
   ::bMouseWheel = {|nKeys, nDelta, nXPos, nYPos| ;
                     If(nDelta > 0, ::VScrollSkip(-10), ::VScrollSkip(10)), 0}

return Self

Esta implementación:

  • Detecta la dirección del scroll mediante nDelta (positivo = arriba, negativo = abajo)<cite />
  • Llama a VScrollSkip() que ya existe en la clase 0-cite-2
  • Usa un valor de 10 píxeles por cada movimiento de la rueda (ajustable según preferencia)<cite />

Alternativamente, puedes usar el patrón de testwscr.prg que utiliza los métodos del scrollbar directamente 0-cite-3 :

Code (harbour): Select all Collapse
::bMouseWheel = {|nKey, nDelta, nXPos, nYPos| ;
                  If(nDelta < 0, ::oVScroll:GoDown(), ::oVScroll:GoUp())}

Notas

  • El método VScrollSkip() ya está implementado en TExplorerBar y maneja correctamente el desplazamiento vertical 0-cite-2
  • La clase hereda de TControl, que procesa automáticamente el mensaje WM_MOUSEWHEEL de Windows y ejecuta el codeblock bMouseWheel cuando está definido 0-cite-4
  • Puedes agregar soporte para modificadores (Shift, Ctrl) siguiendo el patrón de TXBrowse que usa lAnd(nKeys, MK_SHIFT) y lAnd(nKeys, MK_CONTROL) para comportamientos alternativos 0-cite-5

Wiki pages you might want to explore:

Citations

File: source/classes/texplbar.prg (L27-71)

Code (text): Select all Collapse
CLASS TExplorerBar FROM TControl

   DATA aPanels INIT {}
   DATA nTopColor INIT RGB( 122, 161, 230 )
   DATA nBottomColor INIT RGB( 99, 117, 214 )
   DATA oVScroll
   DATA nVPos
   DATA nVirtualHeight
   DATA nVirtualTop
   DATA lSBVisible

   DATA   bClrGrad
   DATA   aGradient

   CLASSDATA lRegistered AS LOGICAL

   METHOD New( nTop, nLeft, nWidth, nHeight, oWnd, nClrFore, nClrBack, oBrush, ;
               l2007, l2010, l2013, l2015 ) CONSTRUCTOR

   METHOD Redefine( nId, oDlg )

   METHOD AddPanel( cName, cBmpName, nBodyHeight, nTitleH, nRound, aGrad, oFnt, ;
                    nClrT, nClrP )

   METHOD CheckScroll()

   METHOD EraseBkGnd() INLINE 1

   METHOD Paint()
   METHOD Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0

   METHOD Initiate( hDlg )

   METHOD Notify( nIdCtrl, nPtrNMHDR ) INLINE ::oWnd:Notify( nIdCtrl, nPtrNMHDR )

   METHOD ReSize( nSizeType, nWidth, nHeight )

   METHOD VScrollSetPos( nPos )
   METHOD VScrollSkip( nSkip )

   METHOD CloseAll( nExcept )

   METHOD Update( nPos )   

ENDCLASS

File: source/classes/xbrowse.prg (L5551-5584)

Code (text): Select all Collapse
   ScreenToClient( ::hWnd, aPoint )

   if IsOverWnd( ::hWnd, aPoint[ 1 ], aPoint[ 2 ] ) .and. ;
      ::MouseRowPos( aPoint[ 1 ] ) > 0

      if lAnd( nKeys, MK_MBUTTON )
         if nDelta > 0
            ::PageUp()
         else
            ::PageDown()
         endif
      elseif lAnd( nKeys, MK_SHIFT )
         if nDelta > 0
            ::GoLeft()
         else
            ::GoRight()
         endif
      elseif lAnd( nKeys, MK_CONTROL )
         if nDelta > 0
            ::FontSize( +1 )
         else
            ::FontSize( -1 )
         endif
      else
         if nDelta > 0
            ::GoUp( WheelScroll() )
         else
            ::GoDown( WheelScroll() )
         endif
      endif

   endif

Return nil

File: samples/test/testwscr.prg (L243-243)

Code (text): Select all Collapse
   ::oWnd:bMouseWheel = { | nKey, nDelta, nXPos, nYPos | If( nDelta < 0, ::oWnd:oVScroll:GoDown(), ::oWnd:oVScroll:GoUp() ) }

File: docs/reference/classes/TControl.md (L47-49)

Code (markdown): Select all Collapse
   METHOD HandleEvent( nMsg, nWParam, nLParam )
  • Línea 217: El despachador de mensajes principal del control. Intercepta los mensajes de Windows (WM_*) y los traduce en llamadas a métodos más específicos y de más alto nivel (ej. WM_LBUTTONDOWN se convierte en una llamada a ::LButtonDown(...)). Este es el núcleo del sistema de eventos.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ajuste de scroll en explorer bar
Posted: Tue Dec 30, 2025 04:14 AM

Funcionando bien:

#include "FiveWin.ch"

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

function Main()

   local oWnd, oExBar, oPanel1, oPanel2, oPanel3, oPanel4
   local bClick := { | o | MsgInfo( o:GetText() ) }
      

   DEFINE WINDOW oWnd TITLE "FWH Class TExplorerBar"
   

   oWnd:SetSize( 350, 600 )

   oExBar = TExplorerBar():New()

   oExBar:bMouseWheel = {|nKey, nDelta, nXPos, nYPos| ;
      If( nDelta < 0, oExBar:oVScroll:GoDown(), oExBar:oVScroll:GoUp() ) }

   oPanel1 = oExBar:AddPanel( "Uno" )
   oPanel1:lSpecial = .T.
   oPanel1:AddLink( "enero" )
   oPanel1:AddLink( "febrero" )
   oPanel1:AddLink( "marzo" )
   oPanel1:AddLink( "abril" )
   oPanel1:AddLink( "marzo" )
   oPanel1:AddLink( "abril" )
   oPanel1:AddLink( "mayo" )
   oPanel1:AddLink( "junio" )
   oPanel1:AddLink( "julio" )
   oPanel1:AddLink( "agosto" )
   oPanel1:AddLink( "septiembre" )
   oPanel1:AddLink( "octubre" )
   oPanel1:AddLink( "noviembre" )
   oPanel1:AddLink( "diciembre" )
      

   oPanel2 = oExBar:AddPanel( "Dos" )
   oPanel2:AddLink( "enero" )
   oPanel2:AddLink( "febrero" )
   oPanel2:AddLink( "marzo" )
   oPanel2:AddLink( "abril" )
   oPanel2:AddLink( "marzo" )
   oPanel2:AddLink( "abril" )
   oPanel2:AddLink( "mayo" )
   oPanel2:AddLink( "junio" )
   oPanel2:AddLink( "julio" )
   oPanel2:AddLink( "agosto" )
   oPanel2:AddLink( "septiembre" )
   oPanel2:AddLink( "octubre" )
   oPanel2:AddLink( "noviembre" )
   oPanel2:AddLink( "diciembre" )

   oPanel3 = oExBar:AddPanel( "Tres" )
   oPanel3:AddLink( "enero" )
   oPanel3:AddLink( "febrero" )
   oPanel3:AddLink( "marzo" )
   oPanel3:AddLink( "abril" )
   oPanel3:AddLink( "marzo" )
   oPanel3:AddLink( "abril" )
   oPanel3:AddLink( "mayo" )
   oPanel3:AddLink( "junio" )
   oPanel3:AddLink( "julio" )
   oPanel3:AddLink( "agosto" )
   oPanel3:AddLink( "septiembre" )
   oPanel3:AddLink( "octubre" )
   oPanel3:AddLink( "noviembre" )
   oPanel3:AddLink( "diciembre" )

   oWnd:oClient = oExBar

   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion