Ajuste de scroll en explorer bar

Post Reply
User avatar
leandro
Posts: 1828
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Ajuste de scroll en explorer bar

Post by leandro »

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.

Image

explbar4.prg

Code: Select all | Expand

#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/
[email protected]
[email protected]

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
User avatar
leandro
Posts: 1828
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Ajuste de scroll en explorer bar

Post by leandro »

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/
[email protected]
[email protected]

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ajuste de scroll en explorer bar

Post by Antonio Linares »

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: Select all | Expand

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: Select all | Expand

::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: Select all | Expand

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: Select all | Expand

   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: Select all | Expand

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

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

Code: Select all | Expand

   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
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ajuste de scroll en explorer bar

Post by Antonio Linares »

Funcionando bien:

Code: Select all | Expand

#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
Post Reply