Liste de picturebox

mirsa57 - 19 avril 2013 à 11:42
 Zermelo - 22 avril 2013 à 08:47
bonjours,

J'essaie de faire un logiciel qui capture l'écran



Sur l'image l'on voit :
- Le bouton qui prend des screen
- Le cadre qui est juste un panel
- Et la petite image en haut a gauche est une picturebox qui affiche le screen

En faite j'essaie de faire que à chaque fois que l'on appuis sur le bouton, le screen apparait dans une picturebox
à coté de la précédente picturebox sans que les picturebox sorte du panel

Ca fait des heures je cherche, je galère trop si quelque peut m'aider S'il vous plait. Merci !

Voici le code :
  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim bounds As Rectangle
        Dim screenshot As System.Drawing.Bitmap
        Dim graph As Graphics
        bounds = Screen.PrimaryScreen.Bounds
        screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
        PictureBox1.Image = screenshot

        Dim Save_screen As New SaveFileDialog
        Try
            Save_screen.Title = "save file"
            Save_screen.FileName = "C:\users\user\desktop\screenshoot" & My.Settings.CompteurSave & ".bmp"
            Save_screen.Filter = "bitmap | *.bmp"
            PictureBox1.Image.Save(Save_screen.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
            My.Settings.CompteurSave = My.Settings.CompteurSave + 1
        Catch ex As Exception
        End Try

    End Sub

28 réponses

Bonjour ucfoutu.

Une transcription en vb.net ne sera pas nécessaire, car il existe dans la classe Math une fonction
DivRem(ByVal a As Integer, ByVal b As Integer, ByRef r As Integer)

qui retourne le quotient de la division entière de a par b, et fournit par l'argument r le reste de cette division. En conséquence,
1) Je me substitue à mirsa57 pour décider que le nombre maximal de PictureBoxes par ligne sera 8.
2) Je désigne respectivement par x et y le rang de la colonne et le rang de la ligne dans lesquelles se trouve le PictureBox en cours de traitement.
Alors, x et y sont respectivement le reste et le quotient de la division entière de Rang par 8. La méthode AjouterPictureBox devient ainsi
Private Sub AjouterPictureBox(ByVal Bmp As Bitmap)
        Dim pic As New PictureBox, Rang As Integer, x As Integer, y As Integer
        listpic.Add(pic) : Rang listpic.IndexOf(pic) : y DivRem(Rang, 8, x)
        With pic
            .Width = 50
            .Height = 50
            .Left = 3 + 56 * x
            .Top = 3 + 56 * y
            .Image = Bmp
        End With
        Panel2.Controls.Add(pic)
    End Sub

Comme tu vois, il existe tout de même de belles choses en vb.net.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 avril 2013 à 13:00
Comme tu vois, il existe tout de même de belles choses en vb.net.

ce sont ... les mêmes qu'en VB6 ( l'opérateur Mod existe même en VBS !)
Mon algo irait toutefois différemment :
1) le nombre max possible
2) ce qui reste "dispo"
3) un calcul de la marge/écart-entre-deux (le dispo/le nb max + 1
4)à la suite devient alors évidente :
- la gauche prévue de la nouvelle picturebox = celle de la précédente + la largeur de la picturebox + la marge
- le haut prévu = le haut de la précédente
et :
si la gauche + la largeur de la picturebox > la largeur du container, alors :
- la gauche = la marge
- le haut = le haut de la précédente + la hauteur de la précédente + la marge
Testé en VB6 ===>> une petite merveille, sans la moindre faille. Et en prime : le même écart, pour chaque ligne complète de pictureboxes, tant avec les bordures du container qu'entre deux pictureboxes.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 avril 2013 à 23:44
Salut


à tester
Public Class Form1
    Dim screenshot As System.Drawing.Bitmap
    Private listpic As New List(Of PictureBox)
    Private Function AddPic() As Boolean
       Dim pic1 As New PictureBox
        Try
            With pic1
                pic1.Width = 50
                pic1.Height = 50
                'placer le pic1
                If listpic.Count > 0 Then
                    If listpic(listpic.Count - 1).Right + pic1.Width + 2 > Panel1.Right AndAlso _
                     listpic(listpic.Count - 1).Bottom < Panel1.Bottom Then
                        'ajouter le pic1 en début de rangé
                        pic1.Location = New Point(2, listpic(listpic.Count - 1).Bottom + 2)
                    End If
                    If listpic(listpic.Count - 1).Right + pic1.Width + 2 < Panel1.Right AndAlso _
                      listpic(listpic.Count - 1).Bottom < Panel1.Bottom Then
                        'ajouter le pic1 à la suite
                        pic1.Location = New Point(listpic(listpic.Count - 1).Right + 2, listpic(listpic.Count - 1).Top)
                    End If
                    
                Else
                    pic1.Location = New Point(2, 2)
                End If
                pic1.SizeMode = PictureBoxSizeMode.StretchImage
                pic1.BorderStyle = BorderStyle.Fixed3D
                pic1.Image = screenshot
                pic1.BringToFront()
                listpic.Add(pic1)
                Panel1.Controls.Add(pic1)
                Return True
            End With
        Catch ex As Exception

        End Try
       
    End Function

    Private Sub Button1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseClick
        Dim bounds As Rectangle

        Dim graph As Graphics
        bounds = Screen.PrimaryScreen.Bounds
        screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
        If Not AddPic() Then
            DirectCast(sender, Button).Enabled = False
        Else
            DirectCast(sender, Button).Enabled = True
        End If
        Dim Save_screen As New SaveFileDialog
        Try
             Save_screen.Title = "save file"
            Save_screen.FileName = "C:\users\user\desktop\screenshoot" & My.Settings.CompteurSave & ".bmp"
            Save_screen.Filter = "bitmap | *.bmp"
            listpic(listpic.Count - 1).Image.Save(Save_screen.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
            My.Settings.CompteurSave = My.Settings.CompteurSave + 1
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        TabControl1.Width = ClientRectangle.Width - 10
        TabControl1.Height = ClientRectangle.Height - Button1.Height - 6
        Panel1.Location = New Point(0, 0)
        Panel1.Width = TabControl1.Width - 10
        Panel1.AutoScroll = True
        Panel1.Height = TabControl1.Height - TabControl1.ItemSize.Height * 2
        Button1.Location = New Point(Me.Width \ 2 - Button1.Width \ 2, ClientRectangle.Bottom - Button1.Height - 4)
    End Sub
End Class
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 avril 2013 à 10:34
Bonjour à tous,
Vachement évolué, VB.Net. Splendide !
Tiens. Voyons ce que donnerait (sans faille. TESTE) mon algo appliqué à VB6 :
On utilise un groupe de contrôles indexés. On place la première picturebox (index 0) dans un Frame (ou une autre picturebox, hein ... ou même sur le Form, ... Ce sera toujours vrai.)
Private Sub Command1_Click()
  Static combien_en_largeur As Integer
  Static marge As Integer
  Dim gauche As Integer, haut As Integer
  If combien_en_largeur = 0 Then
    reste = Frame1.Width Mod Picture2(0).Width
    combien_en_largeur = (Frame1.Width - reste) \ Picture2(0).Width
    marge = reste / (combien_en_largeur + 1)
    Picture2(0).Left = marge
    Picture2(0).Top = marge
  End If
  gauche = Picture2(Picture2.Count - 1).Left + Picture2(Picture2.Count - 1).Width + marge
  haut = Picture2(Picture2.Count - 1).Top
  If gauche + Picture2(0).Width > Frame1.Width Then
    gauche = marge
    haut = Picture2(Picture2.Count - 1).Top + Picture2(Picture2.Count - 1).Height + marge
  End If
  Load Picture2(Picture2.Count)
  With Picture2(Picture2.Count - 1)
    .Visible = True
    .Left = gauche
    .Top = haut
  End With
End Sub


Bon... Raison de plus pour que je ne migre pas vers certains trucs...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
21 avril 2013 à 12:30
Bonjour

le test n'est pas passée
voila un autre testé
d'abord j'ai suprimé ton savedialog chaque bitmap
est sauvegardé avec comme filename My.Settings.CompteurSave.bmp

Public Class Form1
    Dim screenshot As System.Drawing.Bitmap
    Private listpic As New List(Of PictureBox)
    Private Sub AddPic()
        Dim pic1 As New PictureBox
        Try
            With pic1
                pic1.Width = 50
                pic1.Height = 50
                'placer le pic1
                If listpic.Count > 0 Then
                    If listpic(listpic.Count - 1).Right + pic1.Width + 2 > Panel1.Right AndAlso _
                     listpic(listpic.Count - 1).Bottom < Panel1.Bottom Then
                        'ajouter le pic1 en début de rangé
                        pic1.Location = New Point(2, listpic(listpic.Count - 1).Bottom + 2)
                    End If
                    If listpic(listpic.Count - 1).Right + pic1.Width + 2 < Panel1.Right AndAlso _
                      listpic(listpic.Count - 1).Bottom < Panel1.Bottom Then
                        'ajouter le pic1 à la suite
                        pic1.Location = New Point(listpic(listpic.Count - 1).Right + 2, listpic(listpic.Count - 1).Top)
                    End If

                Else
                    pic1.Location = New Point(2, 2)
                End If
                pic1.SizeMode = PictureBoxSizeMode.StretchImage
                pic1.BorderStyle = BorderStyle.Fixed3D
                pic1.Image = screenshot
                pic1.BringToFront()
                listpic.Add(pic1)
                Panel1.Controls.Add(pic1)

            End With
        Catch ex As Exception

        End Try

    End Sub

    Private Sub Button1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseClick
        Dim bounds As Rectangle
        Dim filename As String
        Dim graph As Graphics
        Try
            bounds = Screen.PrimaryScreen.Bounds
            screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            graph = Graphics.FromImage(screenshot)
            graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
            AddPic()
            filename = "C:\users\user\desktop\screenshoot" & My.Settings.CompteurSave & ".bmp"
            listpic(listpic.Count - 1).Image.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp)
            My.Settings.CompteurSave = My.Settings.CompteurSave + 1
            My.Settings.Save()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

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

        TabControl1.Width = ClientRectangle.Width - 10
        TabControl1.Height = ClientRectangle.Height - Button1.Height - 6
        Panel1.Location = New Point(0, 0)
        Panel1.Width = TabControl1.Width - 10
        Panel1.AutoScroll = True
        Panel1.Height = TabControl1.Height - TabControl1.ItemSize.Height * 2
        Button1.Location = New Point(Me.Width \ 2 - Button1.Width \ 2, ClientRectangle.Bottom - Button1.Height - 4)
    End Sub
End Class 


le problème n'est pas la position des picturebox mais à chaque click le Page File ou l'util du fichier (taskmanager -> performance)
augmente de 6 M bytes
0
Bonjours à tous,
ucfoutu c'est vrai que ce n'est pas en préparant des codes tout préparé que je vais apprendre quoi que ce soit en VB, mais les codes que vous m'avez passé je n'y comprenais rien avec ma petite connaissance en VB, je n'ai jamais appris à faire de calcule arithmétique et je n'ai pas eu le temps de les analysés pour les comprendre et les modifier comme je le voudrais. Sinon j'ai quand même cherchais à faire ce que je voulais avec les moyens du bord (mes pauvres petite connaissance en VB)

J'ai placé 64 picturebox que je dois configurer une par une
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim savefiledialog1 As New SaveFileDialog
        Try
            PictureBox1.Image.Save("C:\Users\Samir\Desktop\Screen_n°" & My.Settings.CompteurSave)
        Catch ex As Exception
        End Try
       

        Dim bounds As Rectangle
        Dim screenshot As System.Drawing.Bitmap
        Dim graph As Graphics
        bounds = Screen.PrimaryScreen.Bounds
        screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)



        My.Settings.CompteurSave = My.Settings.CompteurSave + 1
        My.Settings.CompteurPict = My.Settings.CompteurPict + 1

        If My.Settings.CompteurPict = 65 Then
            My.Settings.CompteurPict = 1
        End If

        If My.Settings.CompteurPict = 1 Then
            PictureBox1.Image = screenshot
        End If

        If My.Settings.CompteurPict = 2 Then
            PictureBox2.Image = screenshot
        End If

        If My.Settings.CompteurPict = 3 Then
            PictureBox3.Image = screenshot
        End If

        If My.Settings.CompteurPict = 4 Then
            PictureBox4.Image = screenshot
        End If

'ETC
'JUSQU'AU PICTUREBOX 64...


Sinon merci encore à vous Zermelo, ShayW et ucfoutu ! Je vais tester vos codes et voir si j'arrive à les utiliser correctement.
0
Bonjour mirsa57.

Pour ma part, j'attends que vous mettiez à jour la méthode AjouterPictureBox, en changeant si vous le souhaitez le nombre maximal de PictureBoxes par ligne, et bien sûr que vous testiez. Après cela, j'attendrai jusqu'à lundi matin que vous m'indiquiez si vous voulez ou non continuer avec moi.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Bonjour mirsa57.

Vous avez tardé. En conséquence, je me retire de cette discussion, en vous souhaitant bonne chance.


Étant illettré, je signe d'une croix : ×
0
Rejoignez-nous