Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Disegnare su oggetto Picture box
Forum - C# / VB.NET - [VB.NET] Disegnare su oggetto Picture box

Avatar
Michele79 (Normal User)
Newbie


Messaggi: 2
Iscritto: 15/09/2021

Segnala al moderatore
Postato alle 14:24
Mercoledì, 15/09/2021
Buongiorno a tutti, sto traducendo un programma che crea un disegno tecnico su una picture box da VB6 a VB.NET:
le stesse routine di disegno vengono applicate su due form differenti ma, mentre su un form il programma disegna correttamente, nell'altro form da errore "loggetto è correntemente utilizzato altrove).
Io dichiaro ne form:

Public PicDrawing As Graphics
...
                PicDrawing = PicDrawingPB.CreateGraphics
                PicDrawing.PageUnit = GraphicsUnit.Millimeter
...
poi passo come parametro alle varie routine che creano il disegno la variabile PicDrawing.
Non riesco a capire perché in un form funziona e nell'altro no.

Grazie per l'aiuto

P.S. Ho sempre programmato in VB6 e da 2 anni a questa parte sto traducendo i programmi in VB.NET da autodidatta.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 972
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:35
Mercoledì, 15/09/2021
le picturebox sui due form hanno lo stesso nome ma le identifichi distintamente?

Dal codice non si capisce se PicDrawingPB.CreateGraphics è all'interno di routine distinte contenute nei forms...

Un progetto con due forms contenenti una picturebox ciascuna dove disegni una riga, e ci mostri che non ci riesci, si può debuggare. :rofl:

Per esempio se crei un progetto con due forms che contengono una picturebox ciasuno di nome PicDrawingPB

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Public PicDrawing As Bitmap
  3.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.         ' Disegnare su una bitmap in ram è molto più veloce che disegnare su una picturebox esposta
  5.         ' creo una bitmap delle stesse dimensioni della picturebox
  6.         PicDrawing = New Bitmap(PicDrawingPB.ClientSize.Width, PicDrawingPB.ClientSize.Height)
  7.         ' uso la bitmap come layer grafico
  8.         Dim g As Graphics = Graphics.FromImage(PicDrawing)
  9.         ' imposto l'unità di misura
  10.         g.PageUnit = GraphicsUnit.Millimeter
  11.         ' disegno una riga arancione sulla bitmap in ram
  12.         g.DrawLine(Pens.Orange, 5, 5, 20, 20)
  13.         ' trasferisco la bitmap nel background della picturebox sul form1
  14.         Me.PicDrawingPB.BackgroundImage = PicDrawing
  15.         ' rendo la picturebox sul form2, delle stesse dimensioni della bitmap
  16.         Form2.PicDrawingPB.Size = PicDrawing.Size
  17.         ' trasferisco la bitmap nel background della picturebox sul form2
  18.         Form2.PicDrawingPB.BackgroundImage = PicDrawing
  19.         ' Mostro il form2 che contiene la seconda picturebox
  20.         Form2.Show()
  21.         ' libero la ram
  22.         g.Dispose()
  23.     End Sub
  24. End Class




Ultima modifica effettuata da Carlo il 15/09/2021 alle 22:21


in programmazione tutto è permesso
PM Quote
Avatar
Michele79 (Normal User)
Newbie


Messaggi: 2
Iscritto: 15/09/2021

Segnala al moderatore
Postato alle 9:55
Giovedì, 16/09/2021
Grazie Carlo, utilizzerò sicuramente il disegno su bitmap, ma il problema non cambia.
Cerco di descrivere la cosa in poche parole anche se è un po' complessa (per questo motivo mi viene difficile inserire tutte le righe di codice :)):

- Sia Form1 che Form2 lanciano una routine per il disegno in pianta (mtdPianta) di una struttura che risiede in un modulo passando come parametro l'oggetto graphics.
- mtdPianta lancia delle routine per disegnare i singoli elementi della pianta (mtdElemento1, mtdElemento2, ...)
- mtdElemento1 apre un DB access dove sono salvati tutti i punti e i comandi per disegnare gli elementi, li traduce e li passa a delle routine base per disegnare:
  ad esempio
      MLinea(ByRef Destinazione As Graphics, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, prmpenna As Pen)
  disegna una linea (drawline) su destinazione dalle coordinate X1,Y1 alle coordinate X2,Y2 utilizzando la pen prmpenna.

Form1 è all'inizio del progetto e serve a fare vedere la pianta mentre si scelgono le varie caratteristiche della struttura mentre Form2 è alla fine ed è il risultato finale con la possibilità di stampa della piantina.

Su Form2 il disegno in pianta viene disegnato e si vede correttamente mentre su Form1 no e da errore "l'oggetto e correntemente utilizzato altrove" su Destinazione e quindi non disegna nulla.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 972
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:22
Giovedì, 16/09/2021
MLinea(ByRef Destinazione As Graphics...

l'oggetto grafico Destinazione, passato ByRef, fa si che l'oggetto passato sia a tutti gli effetti lo stesso dell'oggetto ricevuto, non lo puoi richiamare più volte per eseguire operazioni su oggetti distinti.
Prova ByVal, ma dubito che sia sufficiente.

Quando richiami MLinea per operare su un nuovo oggetto grafico, prima dovresti distruggere quello vecchio, ma senza codice sottomano è tutto da verificare.

Ultima modifica effettuata da Carlo il 16/09/2021 alle 20:24


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2091
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:08
Venerdì, 17/09/2021
Se è solo questione di coordinate, ti basta inviare un semplice array al form2 o una struttura in una funzione per disegnare.

Esistono decine di modi per fare questo.

Creare un immagine, ed inviarla al form2.
Ricavare bytes dall'immagine ed inviarla sotto forma di stream al form2.
array, una struttura o lista, ecc. ecc.

Ultima modifica effettuata da Thejuster il 17/09/2021 alle 10:11


PM Quote