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

Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - 13 mai 2019 à 15:18
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 - 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 ?

1 réponse

JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
Modifié le 16 mai 2019 à 15:43
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 !
0
Rejoignez-nous