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 :

CopyfromScreen : enigme pour les doués


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 CopyfromScreen : enigme pour les doués
    Bonjour

    Je me casse la tete a comprendre un truc qui ne marche pas comme je veux

    Explication

    Sur un PB j'ai des tas de point, images et trucs de couleurs
    Si la souris passe sur certains objet durant la mouse move, j'affiche des infos dans un DGV et j'affiche un point sur le PB

    Afin de ne pas perdre l'image sous ce point et ne pas devoir redessiner tout le PB, j'ai cru tres malin de prendre une micro copie d'écran à l'endroit ou je vais afficher le point avant son affichage et replacer cette copie quand la souris passe sur un autre centrte d'intéret

    Ca semble marcher sauf que la recopie du buffer ne rend pas la meme image, il y a un decalage que je n'ai pas encore pu identifier.

    Si qq voit l'erreur : BRAVO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // attributs de la form
        Point curAddrPoint = new Point(-1,-1);           // position reference
        static Image imgBuf = new Bitmap(10, 10);     // buffer image
        Graphics gBuf = Graphics.FromImage(imgBuf);  // Graphics associé au
    buffer


    Fonction
    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
       if (idx>0)
      {
         // nous avons un point pa centre de l'objet intéressé
         Graphics cGraphics = pb_zoom.CreateGraphics();
         if (curAddrPoint.X > -1)  // on replace l'image sauvée
         {
           cGraphics.DrawImage(imgBuf, curAddrPoint.X - 5, curAddrPoint.Y - 5);
         }
     // on sauve un carré 10 x 10 dont pa est le centre
         Point P = new Point(pa.X - 5 , pa.Y - 5);
         Point P1 = this.PointToScreen(P);
     
         gBuf.CopyFromScreen(P1,new Point (0,0),new Size(10,10),CopyPixelOperation.SourceCopy);
     
         curAddrPoint = pa;  // on sauve pa pour coup suivant
    // on affiche un point centré sur pa
         int X = pa.X;
         int Y = pa.Y;
         cGraphics.FillEllipse(semiTransBrushGreen, X - 5, Y - 5, 10, 10);
    }

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    S'il y a un decallage, c est que le system de coordoonées nest pas identique entre la lecture et l'ecriture.

    le CopyFromScreen utilise les coordoonées ecran. est-ce les meme que celles utilisées par les autres fonctions ?

  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
    Salut

    Merci

    J'ai effectivement pensé a ca et a priori j'en ai tenu compte mais ca ne marche pas bien, j'ai laissé tombé le truc momentanément, j'y ai passé 2 heures hier sans comprendre le bingz

    J'ai un peu "nettoyé" le code mais sans succes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            int X = pa.X - 5;
            int Y = pa.Y - 5;
            Graphics cGraphics = pb_zoom.CreateGraphics();
            if (curAddrPoint.X > -1)
            {
              cGraphics.DrawImage(imgBuf, curAddrPoint.X - 5, curAddrPoint.Y - 5);
            }
            Point P1 = this.PointToScreen(pa);
            P1.X -= 5;
            P1.Y -= 5;
            gBuf.CopyFromScreen(P1,new Point (0,0),new Size(10,10),CopyPixelOperation.SourceCopy);
            cGraphics.FillEllipse(semiTransBrushGreen, X, Y, 10, 10);
            curAddrPoint = pa;

  4. #4
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 215
    Points
    1 215
    Par défaut
    Salut

    Tu parle d'un décalage, mais de quelle envergure ??? Est-ce décalé d' 1pxl, ou 5, ou bien cela te met il ton image au point (0,0) ??? Ou a une position totalement farfelue ???
    Ca peut toujours aider à résoudre le problème...

    Mais en regardant ton code simplifié, je vois que au final, curAddrPoint a toujours les même coordonnées que pa (ne peut tu pas enlever une variable ?), et que P1.X = X, et que P1.Y = Y (pourquoi ne pas déclarer directement P1 avec X et Y ?).
    Mais sinon même ça n'a pas l'air de poser problème en tant que tel...
    Sa parait en effet bizarre...

  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
    Salut

    pa c'est les coordonées du curseur a l'entrée dans la fonction
    Coordonées que je récupére dans curAddrPoint qui va me servir replacer le clip au coup suivant la ou je l'avais pris

    P1 sont les coordonées ecran.

    le truc bizare que j'avais eu c'est que si je prends X à 0 (bordure du PB) je fais -5 donc X=-5 je fais alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.PointToScreen(pa);
    et hop X= -15 ???
    Donc j'ai préféré ajuster P1 apres

    Pour le decalage c'est dificille a aprécier, il faudrait que je travaille avec un deuxieme PB et une grille de reference pour voir exactement ce qui est sauvé

    Mais avant de me lancer la dedans j'essayais quand meme de comprendre si je merdais qq chose dans la logique.

  6. #6
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 215
    Points
    1 215
    Par défaut
    Salut

    Ok j'essayais juste d'épousseter encore un peu ton code.
    Mais sinon la logique me parait bonne

    Peut-être essaye juste de vérifier si par hasard dans le reste de ton code, tu ne modifie pas accidentellement pa...

    Sinon faut peut-être envisager le bug surtout si il te met la PB n'importe enfin a un endroit qui ne soit pas logique...

Discussions similaires

  1. Pour les doués SQL
    Par khaigo dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/08/2009, 15h46
  2. [ HIBERNATE ] Question pour les doués
    Par Néo-Tony dans le forum Hibernate
    Réponses: 25
    Dernier message: 23/02/2006, 15h23
  3. Probleme pour les insertion au format etranger
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/03/2003, 10h55
  4. Réponses: 2
    Dernier message: 08/10/2002, 18h26
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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