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 mirsa57.

J'aurais besoin de quelques éclaircissements. En premier lieu, j'ai cru comprendre que vous voulez mettre une capture d'écran (donc de la taille de l'écran) dans un (ou plusieurs) contrôles PictureBox (donc tous plus petits que l'écran). D'autre part vous voulez que tous ces contrôles, en nombre aussi grand que l'on voudra, puissent tenir dans un contrôle Panel (de taille essentiellement finie). Je suis perplexe.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Oui c'est ça ! La capture d'écrans affiche l'image dans la picturebox (en plus petit) et à chaque screen (donc à chaque clique sur le bouton) cela affiche l'image dans une nouvelle picturebox
(exemple: 1er screen afficher dans la picturebox1 le 2nd screen dans la picturebox2 le 3ème screen dans la picturebox3 ainsi de suite...)
0
PS : le panel a une scroolbar et les picturebox sont tous de taille (size) 50x50
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 avril 2013 à 13:06
Salut

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

tu n'as pas besoin d'ajouter ta picturebox en mode design mais en runtime

donc tu dois déclarer une liste de picturebox
qui est vide au début
private lispic as new list (of picturebox)
écris une sub qui ajoute une picturebox
la place par rapport à la derniere faire
attention à ne pas dépasser la limite de ton
panel
je t'envois quelque chose si j'arrive
0

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

Posez votre question
Je vois trois sortes de difficultés dans votre problème.
1) La capture d'écran proprement dite, celle qui produit un bitmap
2) À chaque capture, création et placement géométrique d'un contrôle PictureBox recevant cette capture grâce à la propriété Image.
3) Enregistrement de la liste des images.

Quelle est la difficulté que vous voulez traiter en premier ?

Cordialement.


Étant illettré, je signe d'une croix : ×
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 avril 2013 à 14:04
je n'ai pas compris
si ton picturebox est plus petit que ton écran
tu ne pourras jammais voir toute ta capture
alors tu dois retrécir ta capture
c'est plus compliqué
0
alors tu dois rétrécir ta capture, c'est plus compliqué


Ce n'est pas très compliqué. Il suffit d'utiliser la propriété SizeMode des contrôles PictureBox. Mais bien sûr, l'algorithme de leur placement géométrique devra tenir compte de la valeur choisie pour cette propriété.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
ShayW : La picturebox est sauvegarder sur le bureau en .bmp avec une dimension du screen correct donc y a aucun soucis à se niveau
Et puis quand je cliquer sur un picturebox je vais faire en sorte que lorqu'on clic sur la picturebox ça affiche le screen en + grand enfin bref la n'est pas le soucis c'est un autre sujet !

Merci pour vos réponses mais j'ai rien compris au runtime là et la liste j'ai pas réussi voilà ce que j'ai fais :
Désolé j'suis un débutant.

Zermelo: on traite la 2èmr "À chaque capture, création et placement géométrique d'un contrôle PictureBox recevant cette capture grâce à la propriété Image." ! La 1er picture est à 3x3 de marge du panel,La différence de location entre les pictures du bas et du haut est de 56, et la différence de gauche à droite est aussi de 56

   Private listpic As New List(Of PictureBox)

    Private Sub Addpic()
            Dim pic As New PictureBox
            With pic
            .Width = 50
            .Height = 50
            .Location = New Point(Panel2.Width + 3, 3)
            End With
            listpic.Add(pic)
            Me.Controls.Add(pic)

    End Sub



    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\samir\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
0
Nouvelle question.
Panel2 est-il le nom du panel sur lequel vous voulez déposer les contrôles PictureBox ?

Étant illettré, je signe d'une croix : ×
0
Oui, les picturebox sont dans le Panel2, le panel2 est dans le tabpage1 du tabcontrol1 de la form1.
0
Je m'en doutais. Alors, ça n'est pas du tout ça. Je vais vous préparer quelque chose. Il vous faudra patienter. Vous aurez une réponse dans la journée.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
D'accord je patiente. Merci.
0
Bonsoir mirsa57.
Dans la procédure d'événement du bouton, vous écrivez deux morceaux de code très différents, ce qui est quelque peu bor....que. Je vous demande de bien vouloir mettre le premier sous la forme d'une fonction :
Private Function BitmapProduit() As Bitmap
        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)
        Return screenshot
    End Function

Construisons ensuite une procédure de création des contrôles PictureBox, étant bien entend que le PictureBox1 doit être supprimé,
Private Sub AjouterPictureBox(ByVal Bmp As Bitmap)
        Dim pic As New PictureBox, Rang As Integer
        listpic.Add(pic) : Rang = listpic.IndexOf(pic) ' : MessageBox.Show(Rang.ToString)
        With pic
            .Width = 50
            .Height = 50
            .Left = 3 + 56 * Rang
            .Top = 3
            .Image = Bmp
        End With
        Panel2.Controls.Add(pic)
    End Sub

et il ne restera plus qu'à exploiter ces deux procédures par le bouton de commande,
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        AjouterPictureBox(BitmapProduit)
    End Sub

L'algorithme de placement tient dans le calcul des propriétés Left et Top. J'ai pris pour l'instant un algorithme sommaire, qui met tous les PicturesBox sur une seule ligne. Il gagnerait à être amélioré.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Tout d'abord un grand merci pour cette aide !

Mais comme vous le voyez sur le screen les pictures ne reviennent pas à la ligne elles continuent toujours à droites
J'ai essayé plusieurs code de ce style pour empêcher la scrollbar de continuer et que les pictures reviennent à la ligne. Mais aucun n'a fonctionné
Panel2.HorizontalScroll.Enabled = False


Ensuite les pictures se colle une à coté de l'autre avec 3 d'intervalle au début tout va bien mais comme l'on peut voir sur le screen au bout d'un certain moment les pictures laissent un gros écart entre elle... étrange



Savez-vous comment arranger ça ? J'en demande peut être beaucoup...
Mais merci quand même beaucoup pour toutes l'aide déjà fourni !
0
J'ai bien indiqué que l'algorithme de placement est sommaire. Maintenant vous semblez vouloir que les contrôles PictureBox retournent à la ligne à partir d'un certain nombre. Vous rendez-vous compte que vous m'obligez sans cesse à vous tirez les vers du nez ?
Alors maintenant je vous demande de m'expliquer avec une rigueur mathématique comment vous voulez votre placement. Je reviendrai lire votre réponse après mon repas.


Étant illettré, je signe d'une croix : ×
0
Je m'excuse je pensais que je m'étais expliqué correctement (je suis un peu beaucoup fatigué depuis hier je suis sur le logiciel sans dormir). Je crois avoir compris d'où viennent les gros écarts entre les picturebox, c'est à cause de la scrollbar du Panel2 qui en bougeant fausse l'algorithme de placement.
Je vous remercie je vais pas vous déranger plus longtemps je trouverais un solution autrement en me débrouillant.
0
Vous ne me dérangez pas. Je suis là pour vous aider, y compris en vous frottant un peu les oreilles quand c'est utile. Utile pour vous! Rappelez vous que
Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire viennent aisément.

J'attends encore votre réponse. Reposez-vous d'abord si nécessaire.

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
19 avril 2013 à 20:30
Bonjour (et un grand salut à Zermelo)
Zermelo avait bien précisé que sa démo n'était là que pour le principe et qu'il fallait s'intéresser à son code et l'adapter.
L'adaptation, elle, n'est que l'application d'un peu d'arithmétique (et rien d'autre... et il nous faut espérer qu'en dépit de ton "état de fatigue", tu sais encore calculer en simple arithmétique (quand-même)
Regarde ces deux lignes du code/exemple que t'a montré Zermelo :
.Left = 3 + 56 * Rang
 .Top = 3

Elles ne t'inspirent vraiment rien ? ne te disent vraiment rien ?
On y observe certaines "petites choses" ;
1) Zermelo a prévu une "marge" de 3 pixels et un écart d'autant entre pictureboxes
2) Zermelo a fixé à 50 la largeur de chaque picturebox, mais a rajouté 6 pixels (de bordures sous VB.Net ?)
3)à Zermelo a mis le même top à toutes les pictureboxes. Tu veux maintenant changer de lignes ? Le même mécanisme est alors à appliquer au Top ! ==>>>
si le left + le width d'une picturebox > que la largeur du container ===>> le left est à mettre à 3 et le top à recalculer selon le principe adopté plus haut pour le left ...
On attend que tu t'y mettes, à ce calcul qui demande non des connaossances en développement, mais des connaissances en arithmétique.
________________________
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
Bonsoir à toi, ami ucfoutu.

J'ai tout compris : l'ami mirsa57 n'aime pas Boileau. Blague à part, j'attendrai jusqu'à lundi matin, et je me retirerai de ce fil s'il ne s'est pas manifesté dans l'intervalle.

Je te souhaite une bonne nuit.


É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 à 10:34
l'ami mirsa57 n'aime pas Boileau

Ils sont malheureusement de plus en plus nombreux dans ce cas et c'est assez triste car révélateur de non pensée suffisamment claire au départ-même.
Ceci étant dit : s'il revenait, je t'enverrais par MP un petit algo (facilement transcriptible en code VB.Net) qui te permettra d'éviter de faire à ton tour des calculs arithmétiques
________________________
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
Rejoignez-nous