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

Windows Forms Discussion :

dessiner et gérer des "calques"


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 42
    Points
    42
    Par défaut dessiner et gérer des "calques"
    bonsoir,

    je fais un programme qui dessine sur une image (tracer un contour)
    J'avais envie que le trait se dessine avec le déplacement de la souris avant de valider une ligne avec un clic.
    Le seul moyen que j'ai trouvé c'est de dessiner une ligne dans un événement mousemove.
    Pour ne pas me retrouver avec autant de ligne que de déplacement de souris, j'efface tout et recharge l'image et les points déja validé de mon contour.

    J'aimerais un truc fluide et qui ne déclenche pas de crise d'épilepsie (chargements répété de l'image de fond).

    Je me suis dit que j'allais faire comme un "calque", avec un panel transparent par dessus mon image, je n'effacerais et retracerais que mon contour qui est sur le panel, l'image en fond restant en place.
    Mais j'ai bien peur que la transparence pour un panel soit quelque chose de trop compliqué en Winform.

    avez vous une idée pour gérer un calque, ou une autre méthode qui m'évite de recharger l'image de support a chaque déplacement de la souris?

    merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut tu utilises quoi pour tracer ta ligne ? Graphics ? Normalement un Refresh sur ta PictureBox et un DrawLine ne provoque pas de crise d’épilepsie

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    1/affecte ton image à ton BackgroundImage (mode Imagelayout.strech=>mage aura la taille du control)
    2/un backgroundimage n'est alterer par l'operation de dessin control...
    3/un "calque" equivaut à un new Bitmap(control.width,control.height)

    4/le calque est cree ansi qu'un list<point> dans button click
    5/l'accumulation de points est demarre dans Pic.MouseDown
    5 bis/l'accumulation est continue dans Pic.MouseMove et dessine dans le calque-image
    & appel à Paint du picturebox...
    6/le checkbox permet d'afficher ou cacher le "calque bitmap"...

    code .cs:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinTransparent
    {
        public partial class Form2 : Form
        {
            private Bitmap calque = null;
            private Graphics grCalque = null;
            private bool ShowCalque = false;
            public Form2()
            {
                InitializeComponent();
                this.pictureBox1.BackgroundImage = WinTransparent.Properties.Resources.Tulips;
                this.pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
     
            }
            private List< Point> DistancePoints ;
            private void button1_Click(object sender, EventArgs e)
            {
                calque = new Bitmap(this.pictureBox1.BackgroundImage.Width,this.pictureBox1.BackgroundImage.Height);
                grCalque = Graphics.FromImage(calque);
     
                DistancePoints = new List< Point>();
                this.pictureBox1.MouseDown += new MouseEventHandler(pic_MouseDown);
            }
     
            void pic_MouseDown(object sender, MouseEventArgs e)
            {
                DistancePoints.Add(e.Location);
                this.pictureBox1.MouseDown -= new MouseEventHandler(pic_MouseDown);
                this.pictureBox1.MouseMove += new MouseEventHandler(pic_MouseMove);
                this.pictureBox1.MouseUp += new MouseEventHandler(pic_MouseUp);
            }
     
            void pic_MouseMove(object sender, MouseEventArgs e)
            {
                DistancePoints.Add(e.Location);
                DisplayDistanceCurve();
            }
            void pic_MouseUp(object sender, MouseEventArgs e)
            {
                this.pictureBox1.MouseMove -= new MouseEventHandler(pic_MouseMove);
                this.pictureBox1.MouseUp -= new MouseEventHandler(pic_MouseUp);
     
            }
            private void DisplayDistanceCurve()
            {
                grCalque.DrawLines(Pens.Red, DistancePoints.ToArray());
     
                this.pictureBox1.Invalidate();
            }
     
     
     
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                Graphics gr = e.Graphics;
                if (grCalque == null) return;
                if (ShowCalque)
                { 
                    gr.DrawImage(calque, new Point(0, 0));
                }
     
            }
     
            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                ShowCalque = checkBox1.Checked;
                this.pictureBox1.Invalidate();
            }
     
        }
    }
    Si on veut aller plus loin il faut creer un class Calque(layer) dote de 2 props:
    - Bmp de type bitmap
    - GrCalque de type Graphics
    - ShowCalque de type boolean
    -
    Dans le form on declarera un list<Calque>

    bon code...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    désolé j'avais laissé un peu le code de coté, mais j'ai testé le bout de code qui est posté et ça marche nickel, ça me fait un bonne base pour faire ce que j'ai en tete.
    merci pour vos réponses !

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

Discussions similaires

  1. [Shell][sed]utilisation d'un sed pour gérer des doubles quotes
    Par bstevy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/03/2015, 11h03

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