Copyfromscreen, question pour spécialiste

Signaler
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
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


// 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
      if (idx >= 0)
      {
     // nous avons un point pa centre de l'objet intéressé
         int X = pa.X - 5;
         int Y = pa.Y - 5;
         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 P1 = this.PointToScreen(pa);
         P1.X -= 5;
         P1.Y -= 5;
         gBuf.CopyFromScreen(P1,new Point (0,0),new Size(10,10),CopyPixelOperation.SourceCopy);

// on affiche un point centré sur pa
         cGraphics.FillEllipse(semiTransBrushGreen, X, Y, 10, 10);


         curAddrPoint = pa;   // on sauve pour prochain coup
A voir également:

4 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, je ne sais pas trop ce que tu fais.. mais prendre une capture de l'écran pour redessiner dans ton appli ça me semble très étrange.. à la rigueur Control.DrawToBitmap ou simplement Graphics.DrawImage d'un graphic à l'autre..
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Drawtobitmap ? Je vais voir ca


Pour ce que je fais :


J'ai un picturebox qui contient plein de trucs dessinés par différentes methodes


A un moment je veux mettre en evidence un point sur l'image et je fill un cercle semitransparent mais si l'utilisateur clique ailleurs, je voudrais afficher ce point ailleurs et restituer l'image originale.


Donc pour eviter de refaire le Draw complet du pb ce qui peut s'avérer lourd, lent et complex, je me dis qu'un petit clipping de l'image avant le draw du point pour la restituer ensuite est sans doute le plus simple dans le principe, mais dans la pratique ca se complique !!!


 


 
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
Le draw directement dans le paint pour ce genre de chose est très rarement judicieux. Il est bien plus souvent plus économique d'implémenter un double buffering. Au lieu de dessiner a chaque fois dans le paint, tu dissocie deux cas : l'image doit-elle changer? si ce n'est pas le cas, on dessine l'image contenue en buffer. si cest le cas, on redessine la nouvelle image. Dans ton cas, tu as donc ton image buffer, et dans le paint, tu as je dirais 1 cas (voir 2 selon ce que tu as a faire) :
1 - dans ton constructeur, construit ton buffer qui sera l'image a dessiner
2 - dans ton onpaint, tu dois simplement redessiner car une zone a été invalidée : on flush le buffer et on redessine le cercle (ou tu as deux buffer, le buffer de base sans cercle, et le buffer actuel avec le cercle dessiné) : tu redessine le buffer avec cercle
3 - dans ton onpaint, si le cercle doit changer de place, tu régénère le buffer avec cercle, et tu le dessine
4 - dans ton onclick tu invalidate les zones a invalider
5 - s'il y a des cas ou tu dois régénérer le fond, tu régénère ton buffer de base, puis tu régénère celui avec le cercle a partir de celui de base.

tu auras qqch d'infiniment plus performant (et plus fiable), sans parler de l'effet graphique qui sera probablement plus fluide
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Merci leprov


j'apprecie l'effort dfe cette explication asser détaillée


Je vais bien la digerer, mais a priori c'est +/- ce que je fais déja. Je prends mon souffle et j'explique clairement ce que je fais, car j'ai vraiment envie d'apprendre a etre efficace sur ce coup la.