IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Créer un calque


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Par défaut Créer un calque
    Bonjour à tous

    Sur un pictureBox, je voudrais superposer un calque transparent sur lequel je pourrais dessiner avec la méthode Draw ou autre.
    Je n'ai pas trouvé de contrôle pouvant fonctionner car même un Panel ou un pictureBox avec la propriété BackColor réglée sur "Transparent" ne l'est pas en fonctionnement.

    Si quelqu'un a une idée, elle sera la bienvenue.
    Claude Azoulai
    PS Je travaille en VB2010

  2. #2
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Bonjour,

    Une pictureBox convient, montre nous ton code qui dessine sur ta pictureBox

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Par défaut
    Merci à Jerede de bien vouloir m'aider

    En fait, après la lecture de ta réponse, je me suis apperçu que je n'avais pas besoin de calque.
    Mon application est destiné à éclaicir des zones d'ombre laissées par le scanner sur des documents un peu froissés.
    Ce programe fonctionne en traitant chaque pixel de l'image d'origine qui est mise dans un pictuBox (pbDroite).
    Je voulais donc définir une zone rectangulaire où les pixels ne seraient pas traités, et pour cela je pensais avoir besoin d'un calque pour éviter que le rectangle tracé reste sur l'image après traitement.
    Mais c'était un mauvais raisonnement car je traite les pixels de mon image originale et non pas ceux du pictureBox.
    Dont acte, et donc mille excuses.

    Si tu n'es pas fatigué de moi, il me reste un problème.
    Voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
        Private Sub pbDroite_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseDown
            Xo = e.X    'X origine
            Yo = e.Y    'Y origine
            pbDroite.Cursor = Cursors.Cross
        End Sub
     
        Private Sub pbDroite_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseUp
            Xf = e.X    'X final
            Yf = e.Y    'Y final
            Dim monStylo As New System.Drawing.Pen(System.Drawing.Color.Red)
            Dim formGraphics As System.Drawing.Graphics
            formGraphics = Me.pbDroite.CreateGraphics()
            formGraphics.DrawRectangle(monStylo, New Rectangle(Xo, Yo, Xf - Xo, Yf - Yo))
            monStylo.Dispose()
            formGraphics.Dispose()
            pbDroite.Cursor = Cursors.Arrow
        End Sub
    Mon rectangle n'apparait que quand je relache le bouton de la souris.
    Je pense que je devrais utiliser mouseMove et que à chaque déplacement de la souris, j'efface le dernier rectangle tracé et en dessine un nouveau.
    Mais je n'ai pas trouvé la méthone pour effacer le précédent rectangle.

    Claude Azoulai

  4. #4
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Redéclarer formGraphics à chaque fois n'est pas la meilleure solution.

    C'est juste un exemple, j'ai pas vraiment compris ce que vous souhaitiez comme comportement, donc à vous d'adapter. (_g est un Graphics, que j'obtiens dans le ctor de la Form avec maPictureBox.CreateGraphics())

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (mouseDown)
                {
                    Xf = e.X;
                    Yf = e.Y;
     
                    _g.Clear(pictureBox1.BackColor);
     
                    _g.DrawRectangle(Pens.Red, new Rectangle(Xo, Yo, Xf - Xo, Yf - Yo));
                }
            }
     
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                Xo = e.X;
                Yo = e.Y;
                mouseDown = true;
            }
     
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                mouseDown = false;
            }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Par défaut
    Merci à Jerede

    Ton exemple, bien que devant être du C, m'a bien servi.
    Comme je suis, malgré mes 78 ans, un débutant en VB.Net, car je n"en connais que largement moins de 1% des instructions, j'ai tatonné un peu pour bien placer les déclarations de variable.
    J'ai eu un petit souci à cause de l'instruction "_g.Clear(pbDroite.BackColor)" car l'image qui étatit placée sur le picturBox disparaissait aussi.
    J'ai rajouté deux instructions et cela fonctionne à peu près bien (l'mage est instable pendant le déplacement de la souris, mais reste visible à la fin du tracé de mon rectangle).
    Voici le code, sans aucune prétention (cela peut servir à d'autres lecteurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Public Class Form1
        Dim _g As System.Drawing.Graphics
        Dim monStylo As New System.Drawing.Pen(System.Drawing.Color.Red)
        ...........................................
     
        ...........................................
        Private Sub pbDroite_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseDown
            MouseDovn = True
            Xo = e.X    'X origine
            Yo = e.Y    'Y origine
            _g = pbDroite.CreateGraphics
            pbDroite.Cursor = Cursors.Cross
        End Sub
     
        Private Sub pbDroite_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseMove
            Xf = e.X    'X final
            Yf = e.Y    'Y final
            If MouseDovn Then
                _g.Clear(pbDroite.BackColor)
                pbDroite.Image = MaPhoto2   ' Rajouté car le document
                Application.DoEvents()            ' était effacée
                _g.DrawRectangle(monStylo, New Rectangle(Xo, Yo, Xf - Xo, Yf - Yo))
            End If
        End Sub
     
        Private Sub pbDroite_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseUp
            Xf = e.X    'X final
            Yf = e.Y    'Y final
            pbDroite.Cursor = Cursors.Arrow
            MouseDovn = False
        End Sub
    End Class
    En tous les cas merci de m'avoir aidé.

    Claude Azoulai

  6. #6
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Il ne faut pas redéclarer le graphics à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
        Private _g As System.Drawing.Graphics
        Private monStylo As New System.Drawing.Pen(System.Drawing.Color.Red)
        Private _mouseDown As Boolean
        Private Xo, Yo, Xf, Yf As Integer
     
        Sub New()
            InitializeComponent()
            _g = pbDroite.CreateGraphics()
            _g.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed
        End Sub
     
     
        Private Sub pbDroite_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseDown
            Xo = e.X
            Yo = e.Y
            _mouseDown = True
            Cursor = Cursors.Cross
        End Sub
     
        Private Sub pbDroite_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseMove
            If _mouseDown Then
                Xf = e.X
                Yf = e.Y
     
                pbDroite.Refresh()
     
                _g.DrawRectangle(monStylo, New Rectangle(Xo, Yo, Xf - Xo, Yf - Yo))
            End If
        End Sub
     
        Private Sub pbDroite_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbDroite.MouseUp
            _mouseDown = False
            Cursor = Cursors.Arrow
        End Sub
    Bonne chance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer un nouveau calque en lisp
    Par elasfer dans le forum Lisp
    Réponses: 3
    Dernier message: 11/12/2012, 10h58
  2. [DW MX2004] Calque transparent à créer
    Par titin88 dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 01/09/2007, 02h16
  3. [VB.Net/GDI] Comment créer un calque ?
    Par Speranza dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/05/2006, 15h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo