Equivalent de Me.Autoredraw en Vb.net 2005

Résolu
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 - 4 févr. 2008 à 17:10
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 18 nov. 2014 à 13:07
Bonjour tout le monde;
Je recherche simplement en moyen de reconstituer le graphics d'un formulaire une fois celui-ci redimensionné.
En fait l'équivalent de la propriété AutoRedraw (si mes souvenirs sont bons) en Vb6.

Merci beaucoup pour votre aide :),
Simon

4 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
4 févr. 2008 à 19:09
Salut,

Au plus simple, on dessine le tout dans l'événement Paint du contrôle.

  Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    e.Graphics.DrawString("Salut", Me.Font, Brushes.Blue, 100, 100)
End Sub

Mais si la routine de dessin est complexe et qu'elle te prend trop de temp, ou que tu veux tout simplement des performances d'affichage optimale, il faut effectivement faire ça autrement. Le "plus mieux" dans ce cas, c'est d'utiliser un BufferedGraphics:

Public Class Form1

    Private buffer As BufferedGraphics

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Créer le buffer
        Dim Context As BufferedGraphicsContext = BufferedGraphicsManager.Current
        Context.MaximumBuffer = Me.ClientSize
        buffer = Context.Allocate(Me.CreateGraphics, Me.ClientRectangle)

        ' Dessiner dans le buffer
        buffer.Graphics.Clear(Color.BlanchedAlmond)
        buffer.Graphics.DrawString("Salut", Me.Font, Brushes.Blue, 100, 100)
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        ' "Rendre" le contenu du buffer pour dessiner sur la form
        buffer.Render(e.Graphics)
    End Sub
End Class

Sinon, tu peux aussi créer une image et l'appliquer comme image de fond à ta form. Moins performant (je pense) mais utile pour une gestion correct de tes contrôle ayant BackColor = Color.Transparent

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim MyImage As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
        Dim g As Graphics = Graphics.FromImage(MyImage)
        g.Clear(Color.BlanchedAlmond)
        g.DrawString("Salut", Me.Font, Brushes.Blue, 100, 100)
        Me.BackgroundImage = MyImage
    End Sub

Voilà
3
The Meteorologist Messages postés 232 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 3 novembre 2011 1
4 févr. 2008 à 19:19
Merci infiniment pour cette reponse monstrueusement bien construite [auteur/KEVINORY/183467.aspx Kevin.Ory]
:).

a+
Simon
0
tcari Messages postés 8 Date d'inscription mardi 17 juin 2003 Statut Membre Dernière intervention 9 février 2008
9 févr. 2008 à 20:33
C'est super !!!!

Merci beaucoup pour cette aide !

Grâce à toi, voici ce que j'ai pu faire : le principe était de conserver mon image dans ma picturebox.
C'est très simpliste, mais le but est de l'améliorer..

Il suffit de créer une windows form, d'y ajouter un controle PictureBox (PictureBox1) et de remplacer tout le code !
Public

Class ZoneDessin

Private buffer
As BufferedGraphics

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

End
Sub

Private
Sub dessine()
   ' C'est la fonction (ou une des fonctions) qui permet de dessiner. On dessine directement dans le buffer, et
   ' on définit ce buffer comme ayant la taille du contrôle PictureBOX

   ' définition du rectangle correspondant à la moitié de ma picturebox
   Dim m_rectangle
As
New Rectangle(0, 0,
CInt(PictureBox1.Width / 2), PictureBox1.Height)

   '      Création du buffer
   Dim Context
As BufferedGraphicsContext = BufferedGraphicsManager.Current
   Context.MaximumBuffer = PictureBox1.ClientSize
   buffer = Context.Allocate(PictureBox1.CreateGraphics, PictureBox1.ClientRectangle)

   ' Dessiner dans le buffer
   buffer.Graphics.Clear(Color.Green)
   buffer.Graphics.DrawRectangle(Pens.Black, m_rectangle)
   buffer.Graphics.FillRectangle(
New SolidBrush(Color.Blue), m_rectangle)
   buffer.Graphics.DrawString(
"image conservée",
Me.Font, Brushes.Black, 0, 0)

End
Sub

Private
Sub redessine()
   ' Ici, on redessine sur la picturebox, l'image qui était en mémoire
   Application.DoEvents()
   ' NB : LE DOEVENTS EST OBLIGATOIRE CHEZ MOI !!!
   buffer.Render(PictureBox1.CreateGraphics)

End
Sub

Private
Sub ZoneDessin_Paint(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.PaintEventArgs)
Handles
Me.Paint
   ' On appelle la fonction qui vient rechercher le dessin qui est en mémoire
   redessine()

End
SubEnd

ClassMERCI encore pour ton aide

toto
0
MERCI BEAUCOUP DE VOTRE AIDE
MOI J AI UTILISER
bmp = New Bitmap(Me.Piccanvas.Width, Me.Piccanvas.Height)
Using g As Graphics = Graphics.FromImage(bmp)
Dim pt As PointF = Me.Piccanvas.PointToScreen(New Point(0, 0))
g.CopyFromScreen(pt.X, pt.Y, 0, 0, bmp.Size)
End Using
Piccanvas.IMAGE= bmp
ET MAINTENANT JE UTILISE VOTRE METHODE MAIS J ARRIVE PAS
A SAUVEGARDER L IMAGE DESSINER DANS UN FICHIER .BMP?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 nov. 2014 à 13:07
Bonjour
bon 6 années après LOL

bmp.Save(SaveFileDialog1.FileName, ImageFormat.bmp)


http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.save(v=vs.110).aspx
0
Rejoignez-nous