Comunidad Gambas-es
Mostrando en DrawingArea el area visible de un ScrollArea - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Mostrando en DrawingArea el area visible de un ScrollArea (/thread-1744.html)



Mostrando en DrawingArea el area visible de un ScrollArea - Shell - 24-07-2024

Buenas!.

En este caso he añadido el evento mousemove y he activado la propiedad Tracking del ScrollArea.

[Imagen: FClqbgt.jpeg]

Al principio el primer problema que me encontré es que me mostraba en el DrawingArea las barras de desplazamiento
del ScrollArea, luego lo solucioné.

Código:
Private unaimagen As Image

Public Sub Form_Open()

  unaimagen = Image.Load("Politica-historia-Roma.jpg")

  With ScrollArea1
    .AutoResize = False
    .ScrollBar = Scroll.Both
    .ResizeContents(unaimagen.W, unaimagen.H)
    .Tracking = True
    .Refresh
  End With

End

Public Sub DibujarImagen()

  Paint.Translate(-ScrollArea1.ScrollX, -ScrollArea1.ScrollY)
  Paint.DrawImage(unaimagen, 0, 0)

End

Public Sub ScrollArea1_Draw()

  DibujarImagen
  DrawingArea1.Refresh

End

Public Sub DrawingArea1_Draw()

  Dim otraimagen As New Image
  Dim hbrush As PaintBrush

  If unaimagen Then
    'Si se activa esta línea y se desactiva la siguiente, se muestran las barras de desplazamiento del ScrollArea en el DrawingArea
    'otraimagen = Desktop.Screenshot(ScrollArea1.ScreenX, ScrollArea1.ScreenY, ScrollArea1.Width, ScrollArea1.Height).Image
    otraimagen = Desktop.Screenshot(ScrollArea1.ScreenX, ScrollArea1.ScreenY, ScrollArea1.ClientWidth, ScrollArea1.ClientHeight).Image
    hbrush = Paint.Image(otraimagen)
    hbrush.Scale(DrawingArea1.W / otraimagen.W, DrawingArea1.H / otraimagen.H)
    Paint.Brush = hbrush
    Paint.Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
    Paint.Fill
  Endif

End

Public Sub ScrollArea1_MouseMove()

  ScrollArea1.Scroll(Mouse.X, Mouse.y)

End

Puede que sea interesante añadirle zoom.

Aún así, no funciona del todo. Lo sé por que donde salgo yo, no se muestra, llegaba tarde al senado..je, es deformación profesional.
Fijaros con la barra se ven los dos senadores en la parte inferior derecha del dibujo, en cambio con el ratón no se puede.

Saludos


RE: Mostrando en DrawingArea el area visible de un ScrollArea - Shell - 25-07-2024

Curiosamente en el 2016 había hecho un ejemplo parecido usando el ScrollArea, pero no igual.
La memoria juega malas pasadas. Han pasado ocho años. Vuelvo a hacer algo "parecido"
y creo que no es la primera vez. Vamos que antes tengo que buscar de alguna forma si ya
hice algo parecido, cosa que no es sencilla, entre tantos ejemplos. Lo busqué por el nombre de la imagen.

Desde luego en este ejemplo es mejorado. Es diferente, hasta para dibujar la imagen en el ScrollArea usaba otro método.

En el nuevo uso algo como esto:

Código:
Public Sub DibujarImagen()

  Paint.Translate(-ScrollArea1.ScrollX, -ScrollArea1.ScrollY)
  Paint.DrawImage(unaimagen, 0, 0)

End

Y en el del 2016 usaba este método:

Código:
Public Sub DibujaMe()

  Dim w, h As Float
  Dim hbrush As PaintBrush

  w = imagenfondo.W
  h = imagenfondo.H

  hbrush = Paint.Image(imagenfondo)
  hbrush.Translate(x - ScrollArea1.ScrollX, y - ScrollArea1.ScrollY)
  Paint.Brush = hbrush
  Paint.Rectangle(x - ScrollArea1.ScrollX, y - ScrollArea1.ScrollY, w, h)
  Paint.Fill

End

Creo que el uso de brochas es mejor, en parte, aunque se necesite más instrucciones.

Esta forma:

Código:
Paint.Translate(-ScrollArea1.ScrollX, -ScrollArea1.ScrollY)

Resulta un poco extraña y a la vez recuerda que es algo que sucede con respecto a la anterior coordenada.
Esto me recuerda cuando en el Zx Spectrum dibujaba usando instrucciones PLOT, DRAW.

Plot dibujaba un punto. y Draw un trazado, que podía ser curvo. Pero de un principio "siempre" se tenía
que comenzar con un Plot, para tener un inicio de dibujo y Draw "siempre" iba tomando como referencia (que no se nombraba)
la anterior coordenada, que podía ser el final de un Draw.

Como veis en esa instrucción de Gambas, se usa un sistema parecido. En Gambas usando la librería Paint
existe Paint.LineTo.
 
Cita: 
Adds a line to the path from the current point to position (X, Y) in user-space coordinates. After this call the current point will be (X, Y).

En el caso de Translate. ( Que resulta complejo entender ciertos términos sin ejemplos y explicación lógicamente).
El espacio de usuario , la matriz de transformación, etc.
 
Cita: 
Modifica la matriz de transformación actual (CTM) traduciendo el origen del espacio de usuario por (TX, TY).
TX: Cantidad a trasladar en la dirección X.
TY: Cantidad a trasladar en la dirección Y.
Este desplazamiento se interpreta como una coordenada del espacio de usuario según el CTM vigente antes de la nueva llamada a Translate. En otras palabras, la traducción del origen del espacio de usuario tiene lugar después de cualquier transformación existente.


Ya sabemos que en Gambas usamos la clase Paint que deriva de Cairo, incluso Python y supongo que otros lenguajes, usan Cairo,
( debe ser una librería muy limitada en este lenguaje). Encontrar un manual en español que lo explique, debe ser complicado.
Y es que no es, "exactamente" igual. Paint resulta más fácil de entender. Cairo  hace el mismo trabajo o más, pero sobre un dibujo
y este se graba y luego para mostrarlo hay que cargarlo. Cosa que en Gambas, todo lo que se haga, queda en el control DrawingArea.
 

Nota curiosa en el ejemplo anterior. Tanto x como y no se usan. Este es el código completo del ejemplo del 2016.
Fijaros

Código:
Private imagenfondo As Image
Private x As Integer
Private y As Integer

Public Sub Form_Open()

  Me.Center
  Me.Title = "Ejemplo con ScrollArea"
  imagenfondo = Image.Load("Politica-historia-Roma.jpg")
  ScrollArea1.ResizeContents(imagenfondo.W, imagenfondo.H)

End

Public Sub ScrollArea1_Draw()

  DibujaMe

End

Public Sub DibujaMe()

  Dim w, h As Float
  Dim hbrush As PaintBrush

  w = imagenfondo.W
  h = imagenfondo.H

  hbrush = Paint.Image(imagenfondo)
  hbrush.Translate(x - ScrollArea1.ScrollX, y - ScrollArea1.ScrollY)
  Paint.Brush = hbrush
  Paint.Rectangle(x - ScrollArea1.ScrollX, y - ScrollArea1.ScrollY, w, h)
  Paint.Fill

End

Una cosa es lo que a ti como persona, como razonamiento te parece normal. Un origen de coordenada, un principio
y es que luego no se usa. No somos máquinas.

Saludos