Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   mover ScrollBox para centrar un TImage en pantalla (https://www.clubdelphi.com/foros/showthread.php?t=91649)

Snaked 26-03-2017 12:31:46

mover ScrollBox para centrar un TImage en pantalla
 
hola ecfisa....que tal.....como va todo???

tengo una dudilla aqui a ver si me echas un cable....

te explico...tengo un TImage sobre un ScrollBox y cuando pulso las teclas de cursores, pinto un Cursor sobre el timage mediante Canvas->Draw() la cuestion es que el TImage es mas grande que la zona que se ve en pantalla y queria que cuando el cursor que pinto, alcance el ancho dado, el Scrollbox se desplace un trozo para que el cursor no desaparezca por el borde del limite del ancho de la imagen

un saludo y gracias

el codigo que tengo ahora es este pero se que no esta bien, el caso es que me he levantado hace poco y aun estoy "espeso" en cuanto a pensar un poco en ello jejejej

Cita:

if(MAP_CURSORX * 32 >987) sScrollBox1->ScrollBy(800, 0);
if(MAP_CURSORY * 32 >292) sScrollBox1->ScrollBy(0, 290);
Form1->Image1->Canvas->Draw(MAP_CURSORX * 32, MAP_CURSORY * 32, Form2->Image2->Picture->Graphic);

ecfisa 28-03-2017 00:12:04

Hola.

Contestando al título, para centrar un TImage en un TScrollBox podes hacer:
Código PHP:

...
  
Image->Left = ( ScrollBox->Width  Image->Width  ) / 2;
  
Image->Top  = ( ScrollBox->Height Image->Height ) / 2

Y si entendí bién la consulta del mensaje, lo haría al modo de este ejemplo:
Código PHP:

// (valores a tu gusto)
TPoint pos = (Point)( 11);
int inc    10;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
Image2->Left pos.x;
  
Image2->Top  pos.y;
}

void __fastcall TForm1::FormKeyDown(TObject *SenderWORD &Key,
      
TShiftState Shift)
{
  
TRect sbr ScrollBox1->ClientRect// rect. cliente

  // tratamiento de teclas
  
switch ( Key ) {
   case 
VK_LEFT  pos.-= inc; break;
   case 
VK_RIGHT pos.+= inc; break;
   case 
VK_UP    pos.-= inc; break;
   case 
VK_DOWN  pos.+= inc; break;
  }

  
// desplazamiento horizontal
  
if ( pos.) {
    
ScrollBox1->ScrollByinc);
    
pos.0;
  }

  if ( 
pos.Image2->Width sbr.right ) {
    
ScrollBox1->ScrollBy( -inc);
    
pos.sbr.right GetSystemMetricsSM_CXHSCROLL ) + 2;
  }

  
// desplazamiento vertical
  
if ( pos.0) {
    
ScrollBox1->ScrollBy0inc );
    
pos.0;
  }

  if ( 
pos.Image2->Height sbr.bottom ) {
    
ScrollBox1->ScrollBy0, -inc );
    
pos.sbr.Bottom GetSystemMetricsSM_CXVSCROLL ) + 2;
  }

  
Image2->Left pos.x;
  
Image2->Top  pos.y;


Resultado:



Saludos :)

Snaked 29-03-2017 01:06:53

oye gracias hombre...... lo estaba haciendo de una manera similar aunque no tan sencilla como tu la has hecho

muchas gracias.....voy a probarlo a ver que tal funciona

;)

Snaked 29-03-2017 12:05:49

pues no me funciona correctamente ecfisa......

Snaked 30-03-2017 17:58:17

mira ecfisa... yo lo estoy haciendo asi de esta manera para controlar los desplazamientos del Scrollbox

moveticks y paginas son variables int globales

al principio pongo el cursor del raton encima de las barras del Scrollbox para que actualice inmediatamente si se produce la condicion

el área de visualizacion en pantalla de la imagen es de unos 960x290 pixeles asi que si quiero ver mas imagen es cuando hago esto en el Form1 evento KeyDown

Código PHP:

  SetCursorPos(20325);
  switch(
Key)
  {
    case 
VK_UP:
                
moveticks_y -= 1;
                if(
moveticks_y 0moveticks_y 0;
                if(
ceil(moveticks_y 8) > 1)
                 {
                  
sScrollBox1->VertScrollBar->Position 290 pagina_y;
                 }
                 else { 
sScrollBox1->VertScrollBar->Position 0; }
          
//ShowMessage("UP");
    
break;

    case 
VK_DOWN:
                
moveticks_y += 1;
                if(
moveticks_y Image1->Height 32moveticks_y Image1->Height 32;
                if(
ceil(moveticks_y 8) > 1)
                 {
                  
sScrollBox1->VertScrollBar->Position 290 pagina_y;
                 }
                 else { 
sScrollBox1->VertScrollBar->Position 0; }
          
//ShowMessage("DOWN");
    
break;

    case 
VK_LEFT:
                
moveticks_x -= 1;
                if(
moveticks_x 0moveticks_x 0;
                if(
ceil(moveticks_x 29) > 1)
                 {
                  
sScrollBox1->VertScrollBar->Position 960 pagina_x;
                 }
                 else { 
sScrollBox1->VertScrollBar->Position 0; }
          
//ShowMessage("LEFT");
    
break;

    case 
VK_RIGHT:
                
moveticks_x += 1;
                if(
moveticks_y Image1->Width 32moveticks_y Image1->Width 32;
                if(
ceil(moveticks_x 29) > 1)
                 {
                  
sScrollBox1->VertScrollBar->Position 960 pagina_x;
                 }
                 else { 
sScrollBox1->VertScrollBar->Position 0; }
          
//ShowMessage("RIGHT");
    
break;


  } 


ecfisa 30-03-2017 22:24:22

1 Archivos Adjunto(s)
Hola.
Cita:

Empezado por Snaked (Mensaje 514881)
pues no me funciona correctamente ecfisa......

Que extraño... como te muestro en la animación, me funciona correctamente. Te adjunto los archivos fuente para que los revises y pruebes con tranquilidad.

Ejecuté tu código, pero no desplaza la imágen en absoluto.

Saludos :)

Snaked 31-03-2017 02:52:32

gracias ecfisa.... mañana lo revisare y lo adaptaré al codigo a ver si funciona

mira el ejemplo de Wifi Detection que he puesto en el foro :)

Snaked 31-03-2017 18:05:38

por alguna misteriosa razon que no logro comprender (creo que es el GetSystemmetrics ese) cuando me salgo del borde de la imagen.....la imagen cursor se me descuadra de la rejilla virtual de 32x32 pixeles y pinto los graficos descuadrados .....

necesito que el cursor se mueva 32 pixeles en cada movimiento de las flechas pero que no se descuadre ecfisa

a ver si me echas una mano, el scroll ya lo hace bien


La franja horaria es GMT +2. Ahora son las 06:11:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi