Oppure

Loading
03/08/11 23:14
ashgan
Ciao a tutti, ho questo dilemma. Ho un'immagine molto grande (più della risoluzione del monitor) e vorrei fare in modo che utilizzando le frecce direzionali riesca a vedere le varie parti dell'immagine. Ho provato sia ad utilizzare la proprietà location che la proprietà top/left della picturebox e, sebbene l'immagine venga spostata correttamente in entrambi i casi, con mio dispiacere ho constatato che purtroppo è tagliata alla risoluzione impostata, quindi in pratica, spostando l'immagine in alto, in basso vedo il colore di background grigio invece del resto dell'immagine. Come faccio a creare una cosa del genere? Grazie.
aaa
04/08/11 0:51
ashgan
Ho provato a inserire la picturebox in un panel e ad attivare l'autoscroll. L'effetto è esattamente quello che vorrei, purtroppo ho scoperto che non è possibile nascondere le barre dello scrolling (cosa veramente inspiegabile) e quindi sto da capo a dodici. In vb6 tra l'altro ho trovato un codice che fa proprio quello che voglio (l'ho anche provato e funziona) ma la mia maledetta niubbagine fa si che non riesca a portarlo in vb.net, nel quale molti metodi non esistono più. Il codice è questo:


''Option Explicit

'Private mPic As Picture
'Private mPicWidth As Single
'Private mPicHeight As Single
'Private mCurrentX As Single
'Private mCurrentY As Single
'Private mLeft As Single
'Private mTop As Single

'Private Sub Form_Load()
' mPic = LoadPicture("E:\Down\Tiger.bmp";) 'TO DO: Add path to YOUR Picture file here

' mPicWidth = Me.ScaleX(mPic.Width, vbHimetric, Picture1.ScaleMode)
' mPicHeight = Me.ScaleY(mPic.Height, vbHimetric, Picture1.ScaleMode)
' Picture1.AutoRedraw = True
' ShowPictureAtPosition(mLeft, mTop)
'End Sub

'Private Sub Picture1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' If Button = 0 Then
' mCurrentX = X
' mCurrentY = Y
' ElseIf Button = vbLeftButton Then
' ShowPictureAtPosition(X + mLeft - mCurrentX, Y + mTop - mCurrentY)
' End If
'End Sub

'Private Sub ShowPictureAtPosition(ByVal pX As Single, ByVal pY As Single)
' With Picture1
' .Cls()
' .PaintPicture(mPic, pX, pY, mPicWidth, mPicHeight)
' End With
'End Sub

'Private Sub Picture1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' mLeft = X + mLeft - mCurrentX : mTop = Y + mTop - mCurrentY
'End Sub
aaa
04/08/11 8:26
Ale96
Ti conviene usare la classe graphics, ogni volta che vuoi cambiare immagine usa il metodo drawimage, se necessario puoi fornire coordinate negative, per usare questa classe leggi la guida di totem che è ben fatta!
totemslair.org/guide/…
aaa
04/08/11 10:09
ashgan
Non credo di averci capito molto, comunque praticamente collego un'immagine con un oggetto graphics e tutte le operazioni eseguite su quest'oggetto vengono fatte sull'immagine giusto? Ma comunque poi l'immagine va inserita in una picturebox? Comunque sia ho provato con il metodo drawimage cercando di fargli disegnare la mia immagine da una certa posizione ma, nonostante il codice non generi errori, la posizione non cambia. Il codice che ho usato è questo:

Dim myImage As New Bitmap(filename:="c:\prova.jpg";)
Dim G As Graphics

G = Graphics.FromImage(myImage)


g.drawimage(myimage, new Point(500,500))


Dopo quell'istruzione eseguo flush e metto tutto dentro una picturebox, giusto?:

g.flush()

picturebox1.image = myimage


L'immagine viene visualizzata ma senza che sia stata spostata, come se quello che ho fatto in drawimage non ci fosse.
Ultima modifica effettuata da ashgan 04/08/11 10:41
aaa
04/08/11 17:17
Ale96
Esattamente come dici: tutte le modifiche apportate all'oggetto graphics modificano l'immagine, prima di ridisegnare l'immagine devi cancellare ciò che c'è prima, usa il metodo clear e passagli come parametro un colore di sfondo:
Dim G as graphics = graphics.fromimage(immagine)
G.clear(systemcolors.control)
...
G.flush
Picturebox.image = immagine
aaa
19/09/11 4:08
remeto
Buongiorno, ho un problema, pure io vorrei muovere con il mouse un immagine grande all'interno della picturebox, fin qua tutto facile ma se uso il comando g.clear(colore) mi sparisce tutto e non viene ridisegnata mentre senza il comando g.clear(colore) quando sposto il mouse viene tutto sporcato e sormontato e con un movimento schifoso e scattoso ecco il mio codice simile a ashgan.

Imports VB = Microsoft.VisualBasic
Imports System.Drawing.Drawing2D
Imports System.Drawing.Printing
Imports System.Drawing.Imaging
Public Class Form1
Dim MyImage As Bitmap
Dim G As Graphics
Dim P, P2 As Point
Dim Drawing As Boolean

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

MyImage = New Bitmap(My.Resources.Tavolo)
G = Graphics.FromImage(MyImage)
G.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

P2.X = 0 - MyImage.Width + (PictureBox1.Width)
P2.Y = 0 - MyImage.Height + (PictureBox1.Height)
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'carico immagine nella posizione che desidero

G.DrawImage(MyImage, New Point(P2))
G.Flush()
PictureBox1.Image = MyImage

End Sub

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

P.X = e.X - P2.X
P.Y = e.Y - P2.Y
Drawing = True
End Sub

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

If Not Drawing Then Exit Sub
If P.X = e.X Then Exit Sub


P2.X = e.X - P.X
P2.Y = e.Y - P.Y


G.Clear(PictureBox1.BackColor)

G.DrawImage(MyImage, New Point(P2))

G.Flush()

PictureBox1.Image = MyImage
End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
Drawing = False
End Sub
End Class


ecco, niente errori ma non ci vengo a capo con quel g.clear(colore)
ho letto pure la guida di totem molto chiara.....
Aiuto!!!!!

Grazie!
Ultima modifica effettuata da remeto 19/09/11 4:12
aaa
19/09/11 18:01
Ale96
Devi creare 2 immagini in una ci va l'immagine intera, nell'altra solo il pezzo da mostrare nella picturebox, graphics "deve disegnare" su quest'ultima usando il metodo drawimage e passandogli come parametri l'immagine intera e un punto. L'evento click è inutile rintracciarlo se non ti serve per funzioni particolari.
A occhio l'errore che hai fatto tu è stato usare la stessa immagine questo siglifica che se la sposti ne perdi un pezzo e non lo recuperi se la muovi al contrario.
aaa
19/09/11 19:09
remeto
Grazie, mi faresti 2 righe di esempio su come trattare le 2 cose te ne sarei grato...
aaa