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

C# Discussion :

rendre persistant un draw sur un graphics


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut rendre persistant un draw sur un graphics
    Bonjour

    Il y a un truc que je ne maitrise toujours pas bien avec les graphics :


    1-je fais un graphics sur un bitmap crée a partir d'un picture box

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         Image Zoom = new Bitmap(pb_zoom.Width, pb_zoom.Height);
          Graphics graphics = Graphics.FromImage(Zoom);
    2- Je dessine des trucs dessus et puis j'assigne le bitmap au PB

    En faisant cela, j'ai une image de fond persistante sur laquelle je peux creer un nouveau graphics pour dessiner des images non persistantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          Graphics TmpGraphics = pb_zoom.CreateGraphics();
          TmpGraphics.DrawLine(Pens.Black, pZoomRef, pcur);

    Mais ce que j'aimerais faire c'est
    1- Garder mon image de fond crée au debut
    2- Redessiner des truc dessus qui ne disparaitront pas au moindre refresh
    3- Recuperer mon image de fond quand l'utilisateur a fini de bricoler dans l'image.


    Comment faire cela le plus facilement ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Il te faut que tu redessines à chaque demande de rafraichissement (WM_PAINT).

    Pour ce faire tu peux overrider OnPaint sur ton controle et dessiner depuis cette méthode.

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci,

    Mais j'ai peut etre mal posé la question :

    Quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Image Zoom = new Bitmap(pb_zoom.Width, pb_zoom.Height);
          Graphics graphics = Graphics.FromImage(Zoom);
    Si j'ai bien compris, je dessine directement sur un bitmap de l'Image que j'ai appelé Zoom et puis je peux assigner cette image a mon picture box

    A partir de la pas de probleme de refresh, mon image est fixée

    Maintenant je veux pouvoir laisser l'utilisateur dessiner au dessus de cette image sans alterer l'image de base.
    Je souhaite que cela resiste a un refresh mais a tout moment pouvoir reprendre l'image de base


    J'avais pensé declarer l'image de base publique, faire un clone de cette image et dessiner sur le bitmap de ce clone.
    Et pouvoir a tout moment reprendre l'imagge de base

    Est-ce la bonne solution ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    J'ai déjà fait ce genre de truc, attention la galère...

    Ce que je te conseille déjà, c'est de regarder si tu peux pas passer à vs2008 et utiliser WPF (ya un controle InkCanvas qui fait déjà pratiquement ce que tu recherches)... ça sera bcp plus facile qu'avec les winforms et une bonne occasion de te former si c pas déjà fait...

    Si c'est pas possible, là tout de suite je vois qu'une seule solution :

    Tenir à jour une collections de "formes" et les redessiner pendant le OnPaint
    La création -> MouseDown / MouseMove / MouseUp...
    La sélection / déplacement -> regarde du coté des Adorners http://msdn2.microsoft.com/en-us/library/ms743737.aspx

    Faut aussi penser à la mise à l'echelle de tes formes lors du redimensionnement de l'image, etc...

    bref ya du boulot... voilou, bonne chance

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci

    Je suis déja en cSharp 2008

    C'est pas que je ne veux pas me former on contraire mais a la base ce que je fais est normalement simple

    Fondamentalement voici le bingz

    Ma form principale contient un picturebox
    Au chargement, je load un bitmap (une carte de pays)

    Ensuite je dessine des ellipses (points des villes selon une selection en base de donnée)

    Ca c'est mon image de base
    Pas besoin de resize etc tout est simple et fixe.

    L'utilisateur trace un rectangle sur un graphics que je construit sur le picture box
    Ce rectangle permet de definir une zone zoom que j'ouvre dans une autre fenetre

    Jusque la pas de probleme, je maitrise

    MAIS je veux que mon rectangle persiste jusqu'a la fermeture de la fenetre zoom
    MAIS je ne veux pas le coller dans l'image de base que je veux conserver intacte

    Vois tu une methode simple chef ?
    Mon idée de clonage est elle bonne ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Mon idée de clonage est elle bonne ?
    Ca marche.
    C'est ce que l'on a fait dans une appli, pour afficher une droite mobile qui se retrace dés que la souris bouge avec le click restant appuyé (le point de départ étant celui de du Mouse down et le pointeur de la souris) : à chaque mouvement de souris, on reprend le clone pour retracer la droite.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut graphito

    Pour ce que tu explique, pas besoin de clone, regarde comment moi je fais !!

    L'image de mon pb_cont a été construite est reste persistante, chaque refresh efface ce qu'a fait le précédent draw sur le graphics

    MAIS : c'est lors du mouse_up que je voudrais fixer le rectangle sans alterer l'image de base donc faire le clone !

    La question c'est un clone de quoi ? pour avoir a la fois l'image de base ET le rectangle (carré)


    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
      void pbDrawRectangle(int X, int Y)
        {
          pb_cont.Refresh();
     
          int dX = Math.Abs(X - pRef.X);
          int dY = Math.Abs(Y - pRef.Y);
     
          int Z = Math.Max(dX, dY);
          dX = Z;
          dY = Z;
     
          int rX = pRef.X;
          int rY = pRef.Y;
     
          if (X - pRef.X < 0) rX = X;
          if (Y - pRef.Y < 0) rY = Y;
     
          Graphics graphics = pb_cont.CreateGraphics();
          graphics.DrawRectangle(Pens.Black, rX, rY, dX, dY);
     
        }
     
     
        //***************************************************    
     
       private void pb_cont_MouseMove(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Right) // pour le zoom
          {
            pbDrawRectangle(e.X, e.Y);
            return;
          }
        }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    J'ai omis de préciser que le segment de droite s'affiche sur un graphic contenant l'image d'une carte (pour donner la distance entreles 2 extrémités) ...
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    c'est exactement ce que je fais aussi !!

    1- Je charge un bitmap de fond vierge
    2- Je cree un graphics sur ce bitmap
    3- Je trace des eléments a partir d'une base de données
    4- Je réassigne l'image ainsi créée a mon picturebox

    -------

    5- Maintenant si l'utilisateur veut selectionner des zones ou calculer des distances, j'affiche le segment ou le rectangle sur un autre graphics comme lje l'ai montré dans mon code

    Tout ca va tres bien sauf que je ne sais toujours pas comment je peux "fixer" le segment ou le rectangle si nécessaire

    Ce que j'entends par fixer c'est le garder le segment ou le rectangle sur
    l'image de fond meme si un refresh exterieur se fait

    J'ai le sentiment que ce domaine graphics n'est pas bien connu par beaucoup de développeurs (moi en premier bien sur)
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bah il te suffit de mémoriser les coordonnées du rectangle et de le redessiner dans le OnPaint comme dit plus haut.

    Sinon ya vraiment pas moyen d'utiliser WPF ? ça te donne pas envie ça :

    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
    <Canvas>
     
        <Canvas.Background>
          <ImageBrush ImageSource="image.jpg" />
        </Canvas.Background>
     
        <Rectangle Canvas.Top="32" Canvas.Left="32"
                   Width="128" Height="64"
                   Fill="Red"
                   Stroke="Black" StrokeThickness="1"
                   Opacity="0.6"
                   RadiusX="4" RadiusY="4" />
     
        <Ellipse Canvas.Top="128" Canvas.Left="32"
                 Width="64" Height="64"
                 Fill="Red"
                 Stroke="Black" StrokeThickness="1"
                 Opacity="0.6" />
     
      </Canvas>
    Images attachées Images attachées  

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci astero-H

    1- Memoriser les coordonées du rectangle ?
    Dans ce cas simple ce brico est sufisant mais ca ne me satistait pas conceptuellement

    2- WPF je vais ausculter la chose pour le futur

    3- Mais j'aimerais quand meme resoudre conceptuellement la situation actuelle

    Comment fixer un graphics créé avec creategraphics sur une image ?

    C'est pas parce que je ne trouve pas la clef de contact de ma voiture que je vais tout de suite acheter une autre voiture ou que je vais partir a pied !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Perso je créerait une sous classe de PictureBox du genre :

    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
    class MyPictureBox : PictureBox
    {
        // rectangle représentant la séléction actuelle
        public Rect CurrentSelection { get; set; }
     
        // Création d'une nouvelle séléction
        protected override void OnMouseDown(...) { ... }
     
        // Dessin du rectangle de séléction pendant sa création
        protected override void OnMouseMove(...) { ... }
     
        // Fin de création de la séléction
        protected override void OnMouseUp(...) { ... }
     
        // Tu redessines la séléction pendant le OnPaint
        protected override void OnPaint(...) { ... }
    }

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et qu'est ce que ca apporte ?

    Je cherche le moyen le plus simple de fixer un draw graphics sur une image
    Pas besoin il me semble de reecrire le picture box pour ca !

    Ni de switcher mon app en WPF !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    mouarf... pas la peine d'être désagréable l'ami...

    tu voulais une solution propre pour pouvoir dessiner sur ton image... je t'en donne une (chose que je regrette maintenant)... donc qu'est ce qu'il ne te va pas ?

    a bon entendeur salut...

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Excuse moi de t'avoir offensé !

    Je voulais simplement dire que les solutions que tu propose me semblent relativement complexe face a un probleme qui devrait avoir une solution plus simple a mon avis !

    Je ne cherche pas a construire une autoroute pour aller a Rome, mais le moyen le plus efficace pour y arriver rapidement a moindre frais !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  16. #16
    Membre du Club Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Points : 60
    Points
    60
    Par défaut
    salut !!!
    t'as parlé sur le zoom, j'aimerais faire un bouton zoom qui effectue un zoom sur une image sans modifier ses paramètres (la taille de l'image) c'est a dire quand je fais le zoom c'est vrai que l'image s'agrandit mais je ne veux pas sauvegarder ces nouveaux paramètre ! des que l'utilisateur termine de travailler sur l'image, l'image redevient comme avant !! (image initiale)

  17. #17
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et ton zoom ?
    Comment pense tu le faire
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  18. #18
    Membre du Club Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Points : 60
    Points
    60
    Par défaut
    salut !
    j'ai pas très bien compris ce que tu veux dire !! mais si tu veux dire que je ne peux pas faire un zoom sans modifier la taille de l'image, je suis d'accord avec toi mais par exemple je souhaiterais faire un trackBar qui me permettra d'effectuer le zoom je sais qu'on va agrandir la largeur et longueur mais moi ce que je cherche, c'est de faire un zoom sans modifier les pixels de l'image (je ne sais pas si c'est faisable!).
    bref pour faire le zoom est ce que tu vas modifier la longueur et la largeur de l'image ?
    au fait moi aussi j'ai fait un programme qui charge une image sur pictureBox en suite il dessine des lignes lorsque l'utilisateur clique deux fois sur le contour, donc pour bien voir le contour j'aimerais faire un zoom juste pour qu'il puisse cliquer sur le contour !!!

  19. #19
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Je n'ai toujours pas compris pas ce que tu veux faire

    Pour moi quand je fais un zoom, j'agrandis ou je retrecis forcément l'image

    Dans mon cas, j'agrandis la surface de dessin et je repositionne les objets qui etaient sur la surface originale par rapport a la nouvelle origine et au coeficient d'allongement X et Y, mais je n'agrandis pas les objets eux meme (des points) mais j'aurais pu.
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  20. #20
    Membre du Club Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Points : 60
    Points
    60
    Par défaut
    voila c'est ce que je veux !! et comment t'as fait ?

Discussions similaires

  1. question sur les graphics
    Par jayjay.f dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 11/11/2006, 11h26
  2. Rendre application standalone utilisable sur le Web ?
    Par Amnesiak dans le forum Général Java
    Réponses: 27
    Dernier message: 14/09/2006, 15h09
  3. Rendre le formulaire invisible sur ouverture etat
    Par kimar dans le forum Access
    Réponses: 4
    Dernier message: 24/07/2006, 15h33
  4. Rendre un onglet inactif sur un TPAGECONTROL
    Par richard038 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 12/09/2005, 09h58
  5. Rendre le curseur invisible sur une fenêtre donnée
    Par Meuhmeuh dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/11/2002, 12h25

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