API Setpixel [Résolu]

Signaler
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006
-
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006
-
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

Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006

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/
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006

salut et merci pour ta réponse



c'est bien un picturebox, mais autoredraw a true ou false ne change rien au probleme
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006

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/
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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.
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006

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/
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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