Copier le contenu d'une partie d'une PicBox ailleurs dans la même PicBox

Messages postés
537
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 août 2019
- - Dernière réponse : JeuDuTaquin
Messages postés
70
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
16 août 2019
- 16 mai 2019 à 15:39
Bonjour,
Je ne parviens pas à copier le contenu d'une partie d'une PicBox ailleurs dans la même PicBox.
Alors j'ai fait cet exemple très simple (dans le code définitif j'utiliserai getpixel/setpixel au lieu de point/pset)
    Graph.Line (0, 0)-(100, 50), Dimensions, BF

  PixelX = Graph.Width / Screen.TwipsPerPixelX / Graph.ScaleWidth ' Pixels par mm
  PixelY = Graph.Height / Screen.TwipsPerPixelY / Graph.ScaleHeight ' Pixels par mm

    For i = 0 To 100 * PixelX 
        For j = 0 To 50 * PixelY
            Graph.PSet (i, j + 100), Graph.Point(i, j)
        Next j
    Next i
La première instruction dessine dans le coin supérieur gauche une boîte de 100 x 50 dans l'unité définie par Scalemode qui est le millimètre.
Ensuite les 2 boucles for copient chaque pixel 100 pixels plus bas, j'obtiens ceci

Le rectangle copié est plus petit que l'original, je ne comprends pas pourquoi, qui peut m'aider à résoudre ce mystère ?
Afficher la suite 

1 réponse

Messages postés
70
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
16 août 2019
1
0
Merci
Salut Hervé,

C'est le type de question piège sur VB5 et VB6.

Non, rien de surprenant sur ce problème, récurant sur Visual Basic, car le graphisme et clairement le point faible de ce language.
Avec les problèmes de "Picture", "Picture.image" et "autoredraw"… on tourne souvent en rond avec des problèmes d'affichage et autres fonctions qui ne fonctionnent qu'une fois.

Ici (dans ton exemple), il faut que tu gardes à l'esprit qu'il y a plusieurs "ScaleMode" !

Le principale en "Forme", et celui de la "PictureBox".
Celui en "FORME" restera en "Twip" (car tu recalcules ton ratio grâce à "Screen.TwipsPerPixelX" et celui de ta "PictureBox" qui sera en "pixels".
En deux mots:
forme en Twips : Picture en Twips, on a un ratio de 1.
forme en Twips : Picture en Twips*Screen.TwipsPerPixelX, on a un ratio en pixels.("pset" et "point" utilisent le pixel)

Donc, ton code est bon, mais il faut paramètrer ta forme en "Twip" et ta "picturebox" en "Pixel", car tu as un ratio qui est donné en pixels par "twip".
Tu mets le tout en "Autoredraw", et la taille sera respectée.

Je suppose que tu as testé la fonction "Graph.paintpicture", mais son utilisation est très particulre, et est liée à un paramétrage particulier de la Forme et des PictureBox, vis à vis des Autoredraw, des mis à jour des PictureBox.image et autre manipulation des buffers images/pictures … qui compliques tout !
Commenter la réponse de JeuDuTaquin