Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Picturebox(s) dynamiques (pour faire une mosaique d'image)

5 réponses
Avatar
free
Bonjour ,

je veux faire une mosaique d'images.

Mais je ne voudrais pas faire 10 x 10 pictureboxs mais un tableau à

deux dimensions de picturebox , ou allouer dynamiquement les picturesbox

en (x,y).

Avez-vous une idée ?

(10 x 10 c'est pour commencer , ca pourrait etre bcp plus ).

merci

5 réponses

Avatar
François Picalausa
On Nov 2, 12:09 pm, "free" wrote:
je veux faire une mosaique d'images.

Mais je ne voudrais pas faire 10 x 10 pictureboxs mais un tableau à
deux dimensions de picturebox , ou allouer dynamiquement les picturesbox
en (x,y).



Hello,

Pour avoir une solution un peu performante (allouer des dizaines à des
centaines de hwnd par le système ne l'est, à mon humble avis, pas), je
te conseillerais de réaliser le traçage directement sur une et une
seule picturebox (utiliser des contrôles image pourrait être une autre
solution, mais il m'est encore une fois d'avis que c'est moins
performant que de tracer la mosaique "à la main".

Pour réaliser une telle opération, on utilisera un tableau
bidimensionnel d'objets de classe Picture. Le traçage se fera dans
l'événement Paint du PictureBox, en balayant le tableau

Voici un exemple de code implémentant ce principe.
Option Explicit

Private Pictures() As Picture 'Tableau contenant les images à afficher

Private Sub Form_Load()
Picture1.ScaleMode = vbPixels
LoadFolder "c:tototest"
End Sub

Private Sub LoadFolder(FilePath As String)
Dim FileName As String
Dim i As Long
Dim j As Long

ReDim Pictures(9, 9)

'Charge l'ensemble des bmp contenus dans FilePath dans le tableau
Pictures, de sorte à remplir ce dernier
ChDir FilePath
FileName = Dir("*.bmp")

If (LenB(FileName) <> 0) Then
For i = LBound(Pictures, 1) To UBound(Pictures, 1)
For j = LBound(Pictures, 2) To UBound(Pictures, 2)
Set Pictures(i, j) = LoadPicture(FileName)

FileName = Dir
If (LenB(FileName) = 0) Then
FileName = Dir("*.bmp")
End If
Next j
Next i
End If
End Sub

Private Sub Picture1_Paint()
Const PIC_WIDTH As Long = 24 'Largeur d'une image
Const PIC_HEIGHT As Long = 24 'Hauteur d'une image

Dim i As Long
Dim j As Long

On Error GoTo Paint_end
'Affiche chaque entrée du tableau, en balayant celui-ci
For i = LBound(Pictures, 1) To UBound(Pictures, 1)
For j = LBound(Pictures, 2) To UBound(Pictures, 2)
Picture1.PaintPicture Pictures(i, j), _
(i - LBound(Pictures, 1)) * PIC_WIDTH, _
(j - LBound(Pictures, 2)) * PIC_HEIGHT, _
PIC_WIDTH, _
PIC_HEIGHT
Next j
Next i

Paint_end: 'Dans la pratique, filtrer plus spécifiquement sur l'erreur
générée quand le tableau n'est pas initialisé
End Sub

François
Avatar
free
Merci Francois ,

ca marche.

Encore une petite question :

je veux maximiser la taille de la picturebox. Je sais le faire pour la

Form (propriete WindowsState) mais il n'y a pas l'équivalent pour la

picturebox. Pas d'autres solutions que de le faire à la main en créant

la picturebox ?
Avatar
Jean-marc
François Picalausa wrote:
On Nov 2, 12:09 pm, "free" wrote:
je veux faire une mosaique d'images.

Mais je ne voudrais pas faire 10 x 10 pictureboxs mais un tableau à
deux dimensions de picturebox , ou allouer dynamiquement les
picturesbox en (x,y).



Hello,

Pour avoir une solution un peu performante (allouer des dizaines à des
centaines de hwnd par le système ne l'est, à mon humble avis, pas), je
te conseillerais de réaliser le traçage directement sur une et une
seule picturebox (utiliser des contrôles image pourrait être une autre
solution, mais il m'est encore une fois d'avis que c'est moins
performant que de tracer la mosaique "à la main".

Pour réaliser une telle opération, on utilisera un tableau
bidimensionnel d'objets de classe Picture. Le traçage se fera dans
l'événement Paint du PictureBox, en balayant le tableau



Hello,

Très jolie et élégante implémentation :-)

Je mentionne pour mémoire l'existence s'un vieux composant
standard peu utilisé, qui était une alternative dans certains
cas (un peu différent de ce qu'on veut faire ici, mais bon):
le "PictureClip".
Projects/Copmposants/Microsoft PictureClip Control 6.0 (SP3)
(PICCLP32.OCX).

Ce composant est amusant, il permet par exemple de faire un
jeu de "taquin" en quelques lignes de code :-)

Voici un lien sympa qui explique des techniques sympas
pour faire des trucs graphiques en VB:

http://search.techrepublic.com.com/search/Microsoft+Visual+Basic+6.0+and+image.html

On y parle entre autre de PictureClip :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
François Picalausa
On Nov 2, 2:00 pm, "free" wrote:
je veux maximiser la taille de la picturebox. Je sais le faire pour la
Form (propriete WindowsState) mais il n'y a pas l'équivalent pour la
picturebox. Pas d'autres solutions que de le faire à la main en créant
la picturebox ?



Hello,

Tu peux simplement le faire à la main dans l'événement Resize du form.
Ce devrait donner quelquechose du genre (non vérifié) :
Private Sub Form_Resize()
Picture1.Move Me.ScaleLeft, Me.ScaleTop, Me.ScaleWidth,
Me.ScaleHeight
End Sub

François
Avatar
free