Calque sur Picturebox...

Résolu
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 - 12 nov. 2013 à 10:50
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 - 19 nov. 2013 à 19:11
Bonjour,

Vous me direz, cette question a deja été posée, c'est vrai, mais je n'y trouve aucune réponse satsfaisante.

En gros, j'ai codé un petit oscillo, avec une mire, mais sur le même PictureBox.
De ce fait, si j'efface mes traces, j'efface la mire, etc...

L'idée serait donc de tracer "Définitivement" ma mire sur un PictureBox (PictBMire), qui se trouverait au dessus du PictureBox (PictBTrace), qui lui reçoit les traces.

Mais là, je cale, j'ai essayé

PictBTrace.controls.Add(PictBMire)
PictBMire.Size=PictBTrace.clientSize

Ca marche pas. Pas de transparence...

Quelqu'un aurait-il une idée?

Merci, Marc

8 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
12 nov. 2013 à 14:47
Salut

Possible que je n'ai pas bien saisi
pourquoi ne pas redessiner la mire à chaque fois ?

à propos de traduction
googletranslate traduit de français en français
En gros, j'ai codé un petit oscillo, avec une mire, mais sur le même PictureBox.
De ce fait, si j'efface mes traces, j'efface la mire, etc...

En gros, J'ai code UN petit oscillo, AVEC juin fange, Mais sur le same PictureBox.
De CE FAIT, SI j'efface mes traces, j'efface la boue, etc.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
12 nov. 2013 à 15:44
Bonjour essaie ceci:

Public Class Form1
    Private PreviousPoint As Point ' Dernier point de la souris
    Private ThePen As New System.Drawing.Pen(Color.Black, 10) 'Un Pen pour dessiner.
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Location = New Point(20, 20)
        PictureBox1.Size = New Size(200, 200)
       PictureBox2.Location = New Point(50, 50)
        PictureBox2.Size = New Size(100, 100)
        PictureBox2.BackColor = Color.Transparent
        PictureBox2.BorderStyle = BorderStyle.FixedSingle
        PictureBox1.BackColor = Color.Ivory
        PictureBox1.Controls.Add(PictureBox2)
    End Sub
    'efface
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ThePen.Color = Color.Ivory
    End Sub
    'dessine
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        ThePen.Color = Color.Black
    End Sub
    Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If PictureBox1.Capture Then
            Dim NewPoint As New Point(e.X, e.Y)
            Dim NewGraphic As Graphics = PictureBox1.CreateGraphics()
            NewGraphic.DrawLine(ThePen, PreviousPoint, NewPoint)
            NewGraphic.Dispose()
            PreviousPoint = NewPoint
        End If
    End Sub
    Private Sub PictureBox2_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseMove
        If PictureBox2.Capture Then
            Dim NewPoint As New Point(e.X, e.Y)
            Dim NewGraphic As Graphics = PictureBox2.CreateGraphics()
            NewGraphic.DrawLine(ThePen, PreviousPoint, NewPoint)
            NewGraphic.Dispose()
            PreviousPoint = NewPoint
        End If
    End Sub
End Class

0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
12 nov. 2013 à 17:14
Merci pour cette traduction Fanco-Fraçaise Signaler cs_ShayW! Lol

Pour répondre à ta question, les traces se dessinnent de droite à gauche, pour se faire, à chaque nouvelle aquisition, je fais une copie de l'image du picturebox, je decale cette copie de X pixel que je decale vers la gauche, laissant un "blanc" tout à droite où viendra se dessinner les traces de cette dernière aquisition. Si la mire est dessinnée sur le même PictureB, je la copie aussi!!!

D'où mon besoin d'avoir la mire dans un autre PictureBox, par transparence sur le premier.

@cs_Le Pivert : J'ai déja essayé ces instructions, mais je n'arrive pas au résultat que je souhaite, je vais creuser encore!

Merci à tous, ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 nov. 2013 à 17:50
Bonjour,
Existent des solutions utilisant des fonctions de l'Api de Windows pour faire ta mire "transparente"
Elles sont complexes.
Existent également des solutions/astuces simples. En voilà une :
au lieu d'une seule PictureB : une picturebox PictureB0 invisible et une autre PictureB visible ===>>
A chaque étape :
1) tu dessines sans mire sur la picturebox PictueB0
2) tu écrases l'image de PictureB par celle, sans mire donc, de PictureB0 (simple copie)
3) tu ajoutes à pictureB le dessin de ta mire

0

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

Posez votre question
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
18 nov. 2013 à 11:39
Bonjour ucfoutu,

Désolé pour ce long silence.
J'ai essayé ta proposition, mais un point pose problème.

La largeur PictureBox qui reçoit les traces varie selon le nombre de points à dessiner. de ce fait, ce PBox est équipé d'un scroolbar pour pouvoir visualiser les traces sur l'ensemble de la mesure. J'ai donc tenté de redessiner la mire à chaque mouvement du scroolbar, mais cela donne un résultat "scintillant" et du coup, très peu esthétique.

Tu disais :
"Existent des solutions utilisant des fonctions de l'Api de Windows pour faire ta mire "transparente"
Elles sont complexes.
"

Peux-tu malgré tout me guider sur cette solution?

Encore merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/11/2013 à 12:44
Je veux bien te donner ces indications, mais TU devras savoir t'en servir.
Il me faudrait, sinon, tout écrire à ta place et je déteste les simples (copier/coller)
Les solutions complexes passent par l'utilisation de deux fonctions (entre autres) de l'Api de Windows :
La fonction CreateRectRgn et la fonction CombineRgn, toutes deux de la librairie gdi32
Voilà ! çà, c'est le principal. Le reste, c'est à toi, après les avoir étudiées et comprises, de t'en servir utilement.


________________________
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'interviend
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 nov. 2013 à 14:09
Bonjour
tu peux trouver les memes fonctions dans la class

http://msdn.microsoft.com/en-us/library/system.drawing.region(v=vs.110).aspx
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
19 nov. 2013 à 19:11
Merci UcFoutu, mais je ne penses pas faire partie de gens qui attendent du "tout cuit", j'étudierais donc les instructions que tu me propose.

Merci à toi aussi cs_ShayW! ;)
0
Rejoignez-nous