olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
19 mai 2008 à 07:23
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
20 mai 2008 à 11:24
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);
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 19 mai 2008 à 16:50
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..
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 19 mai 2008 à 17:13
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 !!!
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 20 mai 2008 à 11:16
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
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 20 mai 2008 à 11:24
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.