API Setpixel

Résolu
cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006 - 12 févr. 2005 à 22:06
cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006 - 14 févr. 2005 à 09:57
Salut a tous



voila, j'utilise l'API SetPixel pour remplir une zone dont je connais le HDC (passée en parametre par une appli VB).

Mon probleme est que quand la DLL C++ a fini de dessiner les pixels, et
qu'elle rend la main a l'appli VB, ce qui a été dessiné n'est pas
"figé" cad que si je deplace la fenetre en dehors de l'écran, et que je
la ramene, une partie s'efface !



comment faire pour "memoriser" cette nouvelle image dessinée ??



merci beaucoup par avance

++

http://www.amx-plugin-creator.fr.st/

11 réponses

cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006
14 févr. 2005 à 09:57
yeah j'ai reussi, j'ai un peu bidouillé mais ca marche



voici le code



HDC hdc=CreateCompatibleDC(GetDC(0));

HBITMAP hdc_bmp;

hdc_bmp=CreateCompatibleBitmap(GetDC(0), Width, Height);

fprintf(debug,"0");

SelectObject(hdc,hdc_bmp);

SetBkMode(hdc,1);



puis je dessine sur le hdc, et apres avec VB, je re assigne le hdc au picture avec setobject

SelectObject hdc, picture.hdc



Je suis pas sur que ce soit bien "propre" point de vue allocation de
mémoire et tout (parceque je debute) mais ca marche, c'etait mon but
absolu



encore merci bcp a vous !!

http://www.amx-plugin-creator.fr.st/
3
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
13 févr. 2005 à 00:11
Tout dépend du contexte sur lequel tu dessines.
Si je me rappelles bien, avec VB si tu dessines sur une picturebox, tu dois mettre la propriété autoredraw (ou autorefresh) a true.
Ainsi, l'image sera dessiné a chaque fois que l'événement WM_PAINT sera intercepté.

Shell
0
cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006
13 févr. 2005 à 00:24
salut et merci pour ta réponse



c'est bien un picturebox, mais autoredraw a true ou false ne change rien au probleme
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
13 févr. 2005 à 00:37
Hum,
C'est normal en fait.
Tu dessines sur ton contexte par l'intermediaire de ta DLL.
Autoredraw ne dois pas gérer cela.

T'as essayé de faire un PictureBox.Refreshaprès avoir dessiné dessus, tout en laissant le controle en autoredraw = true ?

Shell
0

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

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
13 févr. 2005 à 09:47
J'ai peut etre une methode 'bourrin' mais qui marchera a coup sur :
Tu sous classes ton controle picture box, et tu geres son apparence a la reception de WM_PAINT.

Ca pourrait marcher non ?

+2(p - n)
0
cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006
13 févr. 2005 à 11:24
oula



le picture box est gerer par VB je peux pas intercepter les evenements, en plus je debute completement en C++



y a pas une API qui ferait ca ? de memoriser l'image ?

http://www.amx-plugin-creator.fr.st/
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
13 févr. 2005 à 12:25
AlexMAN> VB sous classe déjà les controles.

Le plus simple a faire et qu'une fois que tu as dessiné dans ta picturebox, tu sauvegardes sont contenu dans un .bmp puis tu le recharge ensuite tout en laisant l'autoredraw a true.
Ce sera transparent pour l'utilisateur.

Shell
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
13 févr. 2005 à 13:38
C'est pas possible de "mémoriser" comme ca. De toutes facons, la DLL
devra se charger de dessiner à chaque fois qu'il y en a besoin. Par
ailleurs je ne comprends pas l'intérêt de ce que tu cherches à faire
(tu peux pas appeler SetPixel directement en VB?), mais si c'est pour
créer une bmp, ca ne sert à rien de faire une DLL.
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
13 févr. 2005 à 14:55
vecchio56> Tu peux bien évidemment appeller l'api depuis VB mais le problèùe sera le meme.
L'avantage de sauvegarder l'image faite c'est de ne pas avoir a la redessiner systématiquement.
Je m'imagine mal faire ca si l'image résulte d'un calcul d'une minute...
Il est bien plus rapide de charger des pixels deja défini dans un bmp que de devoir tout recalculé (exemple mandelbrot ou julia).

De toute maniere quand tu mets la proriété AutaRedraw a true, tu ne fait rien de plus que sous classé le controle et genéré un WM_PAINT qui redessinera a partir de la mémoire.

A ce compte la autant libéré la mémoire et travaillé a partir d'un fichier.

Sinon tu peux toucher a ta DLL et sauvegarder le résultat dans un fichier bmp, puis après l'appelle a ta fonction de la DLL, tu charges l'image avec PictureBox1.LoadFromFile ( ca doit resembler a ca je crois).

Shell
0
cs_Stephane Messages postés 550 Date d'inscription vendredi 5 janvier 2001 Statut Membre Dernière intervention 23 septembre 2006
13 févr. 2005 à 18:04
salut



merci pour vos aide :



DeAtHCrAsH > j'ai essayé d'enregistrer le picturebox en BMP, mais l'enregistrement ne prend pas en compte les pixels déssiné lui non plus.



vecchio56> non car la DLL traite la partie décompression de l'image en fait



DeAtHCrAsH > c'est vrai le temps de calcul est pas rapide, donc recalculer le tout a chaque WM_Paint est impossible



ouai je crois que je vais faire comme ca : directement generer la BMP
dans la DLL C++, ca doit pas etre trop complique si la structure du BMP
?

http://www.amx-plugin-creator.fr.st/
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
13 févr. 2005 à 18:49
Pas besoin de connaitre la structure d'une bitmap en fait, il suffit de
créer un DC mémoire et une bitmap corrspondante avec
CreateCompatibleBitmap, puis tu utilise le DC mémoire pour le copier
dans le vrai DC de la fenêtre. Tu as un exemple de cela dans la source
'Yeux' de aardman il me semble
0
Rejoignez-nous