Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [VB.Net 2005] CreateGraphics

    Buongiorno,

    sto studiando la GDI+ e sto facendo alcune prove con l'oggetto Graphics. Ho capito che lo si può ottenere in vari modi, uno dei quali attraverso CreateGraphics:

    codice:
    Dim gr As Graphics = PictureBox1.CreateGraphics
    ...
    gr.Dispose()
    da utilizzare al di fuori dell'ambito di Paint; però presenta l'inconveniente di non aggiornare il contenuto della finestra qualora questa venga cambiata.

    Mi chiedevo:

    quali sono le possibili situazioni in cui può tornare utile usare CreateGraphics al posto di recuperare un riferimento a PaintEventArgs nell'evento Paint?

  2. #2
    Può servire se devi disegnare su un controllo al di fuori dell'evento Paint, come ad esempio se consenti all'utente di disegnare a mano libera sul form (il disegno in effetti avverrebbe negli eventi MouseDown, MouseMove e MouseUp); ovviamente al successivo evento Paint tutte le modifiche si cancellerebbero, per cui in questi casi solitamente si disegna contemporaneamente sullo schermo e su una bitmap, che viene poi copiata sul form nell'evento Paint per evitare che i disegni fatti spariscano.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ciao MItaly e grazie per l'aiuto.

    Ergo CreateGraphics non serve quasi a niente...

    Un esempio analogo a quello che hai citato l'ho trovato su un manuale, ma veniva risolto usando una collection List (of...) dove ad ogni click del mouse veniva memorizzata la posizione del cursore e richiamato l'evento Paint per disegnare un rettangolo sullo schermo:
    codice:
    Public Class Form1
    Private puntiPB As New List(Of Point)
    
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    
            puntiPB.Add(New Point(e.X, e.Y))
            PictureBox1.Invalidate()
    
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim grAs Graphics = e.Graphics
    
            For Each p As Point In puntiPB
                gr.DrawRectangle(Pens.DodgerBlue, p.X, p.Y, 20, 30)
            Next
        End Sub
    End Class
    Per quale motivo disegnare su una bitmap risolve il problema dell'aggiornamento della form ?
    Per la bitmap non vale il probllema della cancellazione al successivo evento Paint?

  4. #4
    Per la bitmap non vale il probllema della cancellazione al successivo evento Paint?
    Perché? Una bitmap (System.Drawing.Bitmap) non viene mica cancellata agli eventi Paint, è un oggetto separato dal form e dai controlli.
    L'idea è scrivere contemporaneamente su controllo e bitmap, e all'evento Paint copiare sul controllo la bitmap; dato infatti che la bitmap è stata disegnata in precedenza assieme al controllo essa avrà sopra lo stesso disegno che prima c'era sul controllo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Grazie per la spiegazione, sei stato molto utile.

    Avevo provato e verificato di persona quanto avevi scritto.

    Ciao e Grazie!!!

  6. #6
    Prego, alla prossima!
    Eventualmente dai un'occhiata ai primi tre argomenti di questa sezione, tenendo conto che il messaggio WM_PAINT corrisponde all'evento Paint, GetDC corrisponde più o meno a CreateGrapics e un DC (Device Context) ad un oggetto Graphics (sempre più o meno).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.