PDA

Ver la Versión Completa : mover ScrollBox para centrar un TImage en pantalla


Snaked
26-03-2017, 12:31:46
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

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:

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


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

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

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

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

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

// desplazamiento horizontal
if ( pos.x < 0 ) {
ScrollBox1->ScrollBy( inc, 0 );
pos.x = 0;
}

if ( pos.x + Image2->Width > sbr.right ) {
ScrollBox1->ScrollBy( -inc, 0 );
pos.x = sbr.right - GetSystemMetrics( SM_CXHSCROLL ) + 2;
}

// desplazamiento vertical
if ( pos.y < 0) {
ScrollBox1->ScrollBy( 0, inc );
pos.y = 0;
}

if ( pos.y + Image2->Height > sbr.bottom ) {
ScrollBox1->ScrollBy( 0, -inc );
pos.y = sbr.Bottom - GetSystemMetrics( SM_CXVSCROLL ) + 2;
}

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


Resultado:
https://s10.postimg.org/tvhu3js8p/Snaked4.gif


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

SetCursorPos(20, 325);
switch(Key)
{
case VK_UP:
moveticks_y -= 1;
if(moveticks_y < 0) moveticks_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 / 32) moveticks_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 < 0) moveticks_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 / 32) moveticks_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
Hola.
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