Paintpicture et autoredraw

jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006 - 16 déc. 2005 à 17:39
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006 - 21 déc. 2005 à 02:52
Bonjour, je travaille sous VB 6 et j'utilise des paintpicture mais la,
j'ai un message d'erreur et j'aimerais savoir ce que vous en pensez :



"


Impossible de créer une image en mode
AutoRedraw. (Erreur 480)




<object id="alink_1" style="left: 10px; width: 70px; top: 118px; height: 18px;" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" height="18" width="70"></object>



Visual Basic ne peut pas créer une image bitmap permanente pour redessiner
automatiquement la feuille ou l'image. La cause et la solution de cette erreur
sont les suivantes :



<li>La quantité de mémoire disponible ne permet pas d'affecter la valeur True
à la propriété AutoRedraw.
Affectez la valeur False à la propriété AutoRedraw,
puis redessinez vous-même l'image dans la procédure d'événement Paint. Vous
pouvez également réduire la taille du contrôle PictureBox ou de l'objet
Form avant de tenter à nouveau l'opération en affectant la valeur True
à la propriété AutoRedraw.

</li>

"


merci d'avance

9 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 déc. 2005 à 17:48
Et voui, l'autoredraw, c'est bien, mais ca bouffe beaucoup de
ressources (2x plus de ressources pour un bitmap vu qu'il faut le
stocker pour l'affichage, et pour le raffraichissement).



La solution : passer par des buffers crées toi-même, ca évite le bug de
l'autoredraw qui reste en mémoire... voir ma classe de gestion d'image
par exemple.

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
16 déc. 2005 à 23:23
ok, merci! je vais regarder! mais c'est marrant, je ne pensais pas un
jour, voir des limites a VB, mais a priori, niveau gestion d'image,
c'est pas le langage a choisir!!!
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
20 déc. 2005 à 16:29
excuse-moi DarkSidious, mais je suis novice, et j'ai du mal a interpreter ton conseil:

"La solution : passer par des buffers crées toi-même, ca évite le bug de
l'autoredraw qui reste en mémoire... voir ma classe de gestion d'image
par exemple"!



Je ne comprends pas ce que tu entends par 'le bug de l'autoredraw qui
reste en memoire' et je ne sais pas comment creer un buffer pour y
placer une image presente sur mon disque dur.



J'ai regardé ta source sur la classe de gestion d'image mais j'ai du
mal a l'adapter a mon probleme, je ne vois pas comment faire. Peux tu
m'aider et m'expliquer comment avoir le meme resultat qu'un
paintpicture sans l'utiliser?



un grand merci d'avance
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 déc. 2005 à 16:47
Ton problème ne vient pas du PaintPicture, mais de l'autoredraw. Le paintpicture marche très bien, mais l'autoredraw, lui, encombre la mémoire graphique pour rien !

La solution : stocker l'image à afficher dans un buffer (du moins bon au meilleur (mais aussi du plus simple au plus compliqué) : picturebox invisible, contrôle Image invisible, stdPicture, ma classe de gestion d'image, un DC Temporaire), c'est-à-dire stocker l'image à afficher quelque part pour pouvoir la réafficher dans la procédure Paint de ton picturebox, ce qui simule un autoredraw, sans le problème de mémoire graphique qui grimpe sans arrêt.

Donc, tu trace ce que tu veux afficher dans un buffer (par exemple, dans un stdPicture), puis tu l'affiche dans ton événement Paint :

private sub Picture1_Paint()

Set Picture1.Picture = stdPicture1

end sub

Maintenant, un petit tour d'horizon des buffers que je te propose :
* PictureBox temporaire : gaspille des ressources pour rien (une fenêtre, un DC en plus de l'image).
* Contrôle image : autant passer par un stdPicture qui ne fera que stocker l'image puisque le contrôle est invisible de toute façon !
* stdPicture : stocke l'image, mais également des propriétés de l'image.
* ma classe de gestion d'image : manipulation très rapide des pixels si besoin, par contre, nécessite d'avoir un picturebox temporaire dans lequel on trace avec les paintpicture, il s'agit d'un DC temporaire, mais avec des fonctions de manipulation directe des pixels.
* DC Temporaire : l'idéal, mais le plus compliqué : ne fait que créer un DC, donc peu de ressources occupées, par contre, bien plus dur à utiliser car passage obligé par les API Windows que ce soit pour le paintpicture (à remplacer par StretchBlt), ou la manipulation directe des pixels, ou l'affichage de l'image !!!

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
20 déc. 2005 à 17:48
merci beaucoup pour cette réponse tres interessante et sur laquelle je
vais reflechir car elle m'a fait decouvrir beaucoup de choses, a
commencer par l'evenement Paint! en effet, je croyais que cet evenement
servait surtout a rafraichir une image apres deplacement d'une fenetre,
... non? j'ai regarde l'aide mais je ne vois pas trop quand la faire
intervenir. JE vais essayer de t'expliquer ce que j'essaie de faire,
alors si tu as le courage de lire, voila mon but:



J'ai deux formulaires, l'un visible et l'autre non. Sur le visible,
j'ai un picturebox reduit, qui permet de faire tenir toute l'image sur
mon ecran, c'est une sorte de "viewer". Dans le formulaire invisible,
j'ai une grande picturebox qui me sert a travailler mon image et c'est
cette grande image que j'enregistre a la fin. Ce picturebox n'est pas
visible mais a des dimensions enormes (genre 20000*30000 twips) afin de
garantir une image de haute resolution. Je sais que c'est tres lourd
mais je n'ai pas trouve d'equivalent a un picturebox invisible pour
faire des manipulations dessus , comme des paintpicture.



Ce que j'aimerais faire a present, c'est lorsque je selectionne une
zone a la souris, sur ma petite picturebox de mon formulaire visible,
c'est d'ouvrir une image de mon disque dur, selectionner la zone que
j'ai choisi auparavant, et placer cette zone dans ma grande picturebox
invisible. Puis, je ferais un paintpicture, pour afficher l'apercu dans
mon formulaire visible.



Pour l'instant, j'essaie d'utiliser un stdpicture en faisant ainsi:



1) je clique sur un bouton et je charge une image dans ma StdPicture



2) je fais un cadre de selection a la souris sur ma picturebox visible et je recupere les coordonnées de mon cadre



3) je charge ma StdPicture dans une picturebox intermediaire afin de
faire ensuite un paintpicture vers ma grande picturebox, en ne
"peignant" que le rectangle selectionne a la souris.

La, je pense que ma picturebox tampon est inutile mais je ne sais pas
recuperer qu'une partie de ma Stdpicture sans la charger avant dans une
picturebox!



4) je fais de nouveau un paintpicture de ma grande picturebox vers ma picturebox visible.



Alors voila, je sais que c'est hyper lourd, et nous en avions deja
parle car j'aimerais aussi supprimer ma grande picturebox invisible et
la remplacer par une stdpicture mais le probleme etait toujours celui
des paintpicture. Peut etre que dans ce que tu m'as mis (du cote des
buffer) je vais trouver mon bonheur?



J'espere que tu cernes davantage ce que je veux faire et si tu veux des
complements d'informations, pas de souci! car c'est parfois dur de
faire passer ce que l'on souhaite faire et qui semble evident pour nous!



merci beaucoup
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 déc. 2005 à 18:01
Oui je me rappelle de ton problème, on en avait parlé il y a quelques temps.

Dans ton cas, vaux mieux passer par un DC, c'est le moins lourd (uniquement une zone mémoire pour stocker ton image, pas d'affichage et de fenêtre intermédiaire, et surtout, pas de problème d'autoredraw !

Durant les vacances de Noël, si j'ai le temps, il faut que je modifie ma classe de gestion d'image, car j'ai pensé à des petites optimisations qui pourrait donner encore plus de performances (nottament en la passant en dll C, faut que je teste), et je lui apporterais des évolutions, comme par exemple créer un DC temporaire de la taille qu'on veux, et pouvoir manipuler ce DC directement.
De plus, charger une image directement dans ma classe sans devoir passer par une picturebox, etc.
Donc la rendre beaucoup plus complète, et si possible, plus rapide encore, et ca devrait te résoudre ton problème, mais c'est si j'ai le temps (je peux pas me permettre d'y passer plus de 2 jours).

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
20 déc. 2005 à 18:12
bon courage alors! juste une petite requete: le top pour moi, serait
donc de pouvoir avoir une sorte de Stdpicture mais a partir de laquelle
je pourrais faire des equivalents de paintpicture, genre:



dim stdpicture as SuperStdPictureDKS

set stdpicture = loadpicture ("...")

form1.picture1.paintpicture stdpicture ,,,,



et pourquoi pas l'inverse:

stdpicture.paintpicture form1.picture1.image,,,,





C'est le moment du pere noel, alors on peut toujours rever!!!





enfin, j'ai essayer ton code sur la classe de gestion d'image, et j'ai l'impression qu'il galere avec de gros fichiers, non?



et pour finir, juste une question toute bete, qu'est qu'un DC ?



merci, bonnes fetes de fin d'année et bon courage !
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 déc. 2005 à 19:29
Attention, ma classe de gestion d'image est faîte pour travailler avec des pixels, si tu lui passe des twips, forcément ca va ramer (compte 360 fois plus de calcul qu'avec des pixels !!!).

Mon but, c'est de rendre ma classe aussi simple à utiliser qu'une stdPicture, sans être une stdPicture pour autant : ajout de fonctionnalités telles que Point, PSet, Rectangle, etc.

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
21 déc. 2005 à 02:52
ok, autant pour moi! je n'avais pas pensé que twips ou pixel, cela
changeait quelque chose! pour moi, ce n'etait qu'une histoire de
rapport de 15!
0
Rejoignez-nous