Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Desplazamiento sincrónico de dos TScrollBox

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Desplazamiento sincrónico de dos TScrollBox Responder citando

Buen día, saludos a todos se puede sincronizar el movimiento de la barra de desplazamiento vertical de dos TScrollBox tengo el código para hacerlo con la rueda del ratón pero si los muevo al con clic directamente se desincronizan
Código:

void __fastcall TFGantt::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
          TPoint &MousePos, bool &Handled)
{
   TImage *IShape = (TImage*) FindComponent(seleccionShape);
   if(IShape && ILienzo->Tag == 0){
        String cons = IShape->Name;
      cons = cons.SubString(7,cons.Length());

      TTrackBar *TrBar  = (TTrackBar*) FindComponent("TrBar"+cons);
      if (WheelDelta > 0) {
         TrBar->Position +=1;
         }
      else {
         TrBar->Position -=1;
         }
      }

   if(ILienzo->Tag == 1 && Shift.Contains(ssAlt)){
      if(WheelDelta > 0){
         ScrollBox1->HorzScrollBar->Position+=35;
         }
      else{
         ScrollBox1->HorzScrollBar->Position-=35;
         }
      }
   else if(ILienzo->Tag == 1){
      if(WheelDelta > 0){
         ScrollBox1->VertScrollBar->Position-=35;
         ScrollBox2->VertScrollBar->Position-=35;
         }
      else{
         ScrollBox1->VertScrollBar->Position+=35;
            ScrollBox2->VertScrollBar->Position+=35;
         }
      }
   ICabecera->Left = ScrollBox1->HorzScrollBar->Position * -1;
   Handled = true; // Mark event as handled
}
//---------------------------------------------------------------------------

_________________
[code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hace un par de años, contesté una pregunta parecida para sincronizar Srolls de dos ListView. Se basó en control por subclassing. Ese hilo ha desaparecido del foro. supongo que tras recuperar algún Bakup

Te muestro algo parecido para lo que hoy preguntas.
He puesto en un formulario dos TScrollBox con la misma imagen, mayor que ellos. Hago un subclassing para ambos e interceptar el mensaje WM_VSCROLL y WM_HSCROLL. Lo siguiente es repetir en uno lo que ocurre en el otro.

Pongo el código completo incluido el archivo cabecera

Cabecera:
Defino un tipo de puntero a función de mensajes.
Dos TScrollBox, Dos TImagen
Las funciones de Subclassing, una para cada SrollBox

Código:

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>

#include <ExtCtrls.hpp>
#include <jpeg.hpp>

typedef void __fastcall(__closure *PWndProc)(Messages::TMessage &Message);

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
  TScrollBox *ScrollBox1;
  TScrollBox *ScrollBox2;
  TImage *Image1;
  TImage *Image2;
private:
  PWndProc SB1WndProc;
  PWndProc SB2WndProc;
  void __fastcall SubClassSB1WndProc(TMessage& Message);
  void __fastcall SubClassSB2WndProc(TMessage& Message);
public:      // User declarations
  __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Código:
Código:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
void __fastcall SetSubCass(TWinControl *WC, PWndProc newProc, PWndProc *oldProc)
{
  *oldProc = WC->WindowProc;
  WC->WindowProc = newProc;
}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  SetSubCass(ScrollBox1, SubClassSB1WndProc, &SB1WndProc);
  SetSubCass(ScrollBox2, SubClassSB2WndProc, &SB2WndProc);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SubClassSB1WndProc(TMessage& Message)
{
  // Se tratan los mensages originales antes de interceptarlos
  SB1WndProc(Message);

  // Se modifica la rueda del mouse para convertirlo en Scroll
  if(Message.Msg == WM_MOUSEWHEEL){
    Message.Msg = WM_VSCROLL;
    Message.WParamLo = SB_LINEUP;
    ScrollBox1->VertScrollBar->Position -= (short)Message.WParamHi/10;
  }
  // Tratamos los mensajer de Scroll
  if(Message.Msg == WM_VSCROLL){
    if(Message.WParamLo == SB_LINEUP)
      ScrollBox2->VertScrollBar->Position = ScrollBox1->VertScrollBar->Position;
    else if(Message.WParamLo == SB_LINEDOWN)
      ScrollBox2->VertScrollBar->Position = ScrollBox1->VertScrollBar->Position;
    else if(Message.WParamLo == SB_THUMBTRACK){
      ScrollBox1->VertScrollBar->Position = Message.WParamHi;
      ScrollBox2->VertScrollBar->Position = Message.WParamHi;
    }
  }
  else if(Message.Msg == WM_HSCROLL){
    if(Message.WParamLo == SB_LINELEFT)
      ScrollBox2->HorzScrollBar->Position = ScrollBox1->HorzScrollBar->Position;
    else if(Message.WParamLo == SB_LINERIGHT)
      ScrollBox2->HorzScrollBar->Position = ScrollBox1->HorzScrollBar->Position;
    else if(Message.WParamLo == SB_THUMBTRACK){
      ScrollBox1->HorzScrollBar->Position = Message.WParamHi;
      ScrollBox2->HorzScrollBar->Position = Message.WParamHi;
    }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SubClassSB2WndProc(TMessage& Message)
{
  // Se tratan los mensages originales antes de interceptarlos
  SB1WndProc(Message);

  // Se modifica la rueda del mouse para convertirlo en Scroll
  if(Message.Msg == WM_MOUSEWHEEL){
    Message.Msg = WM_VSCROLL;
    Message.WParamLo = SB_LINEUP;
    ScrollBox2->VertScrollBar->Position -= (short)Message.WParamHi/10;
  }
  // Tratamos los mensajer de Scroll
  if(Message.Msg == WM_VSCROLL){
    if(Message.WParamLo == SB_LINEUP)
      ScrollBox1->VertScrollBar->Position = ScrollBox2->VertScrollBar->Position;
    else if(Message.WParamLo == SB_LINEDOWN)
      ScrollBox1->VertScrollBar->Position = ScrollBox2->VertScrollBar->Position;
    else if(Message.WParamLo == SB_THUMBTRACK){
      ScrollBox1->VertScrollBar->Position = Message.WParamHi;
      ScrollBox2->VertScrollBar->Position = Message.WParamHi;
    }
  }
  else if(Message.Msg == WM_HSCROLL){
    if(Message.WParamLo == SB_LINELEFT)
      ScrollBox1->HorzScrollBar->Position = ScrollBox2->HorzScrollBar->Position;
    else if(Message.WParamLo == SB_LINERIGHT)
      ScrollBox1->HorzScrollBar->Position = ScrollBox2->HorzScrollBar->Position;
    else if(Message.WParamLo == SB_THUMBTRACK){
      ScrollBox1->HorzScrollBar->Position = Message.WParamHi;
      ScrollBox2->HorzScrollBar->Position = Message.WParamHi;
    }
  }
}


Se consigue un movimiento suave de ambos ScrollBox en ambas direcciones y en tiempo real.

Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

escafandra escribió:
Hace un par de años, contesté una pregunta parecida para sincronizar Srolls de dos ListView. Se basó en control por subclassing. Ese hilo ha desaparecido del foro. supongo que tras recuperar algún Bakup


Hola escafandra, en algún momento se debió hacer algún traslado del foro, no le he preguntado a Roberto (R.Porcar), y veo que el foro se dividió en dos:

https://cppbuilder.es/foros/

y

https://foros.ryanstudios.com/

Antes de eso los dos dominios apuntaban al mismo lugar. En el primero veo que hay más hilos (por si encuentras ahí el hilo que mencionas), pero veo que el poco movimiento que hay el que aparentemente más gente conoce es el segundo. No he querido darle mucho la lata a Roberto ya que total no hay mucho movimiento y yo tampoco entro mucho y creo que el hace mucho que dejó de usar C++Builder, aun así ha mantenido esto durante más de 25 años..

¿Quizás sea este hilo?:
[Sincronización de scroll vertical de dos TListViews]
https://cppbuilder.es/foros/viewtopic.php?t=15170
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:

¿Quizás sea este hilo?:
[Sincronización de scroll vertical de dos TListViews]
https://cppbuilder.es/foros/viewtopic.php?t=15170


Efectivamente ese es el hilo. Solo me acordaba del tema. Yo conocía los dos dominios y que https://cppbuilder.es/foros/ comenzó a fallar.

Es una lástima que se haya dividido. Aunque no se tenga mucha actividad hay mucha información de consulta útil.

Gracias _Leo por el interés.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.