Probléme avec la fonction SetPixel de l'api windows

Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013 - 21 déc. 2008 à 14:35
DoctorNitro Messages postés 3 Date d'inscription samedi 28 mars 2009 Statut Membre Dernière intervention 16 juillet 2009 - 16 juil. 2009 à 19:39
Salut Salut tous le monde si je vien poster sur ce forum c'est parce que je n'arrive pas a trouver des explication a un mystérieux bug de la fonction setpixel de windows je m'explique :
tous d'abord je souhaite realiser un programme qui puisse dessiner sur le bureau de windows, et donc pour cela j'utilise la fonction GetDC(0) afin d'obtenir le device contexte du bureau, puis aprés je procéde via une boucle a la coloration pixel par pixel du bureau, mai cest la qu'et le probléme, au lieu de me mettre tous le bureau en blanc seulement 3 "portions" de l'écran sont peinte une a gauche l'autre au centre la derniére a droite et il me laisse les autres normal ...

Voici le code (simplifié au maximum):

_____________________________________________________________________________________
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
int x0=0;
int y0=0x0;
HDC x; // stockera notre device context

x =GetDC(0);
while(1)
{
while(y0 < 900)
{
while(x0 != (1200) )
{
SetPixel(x,x0,y0,0xFFFFFF);
x0+=1;
}
y0+=1;
x0=0;
}
y0=0x0; // on repart a zero en redessinant l'écran en blanc
x0=0x0;
}
}
_______________________________________________________________________________________

Je vous saurez trés reconnaissant de m'éclairer sur ce petit bug (qui n'en ai peut etre pas un, et qui vien du fait que je programme comme un pied )

Merci d'avance</windows.h></stdlib.h></conio.h></stdio.h>

10 réponses

Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
21 déc. 2008 à 14:40
excusez moi je sais pas pourquoi les retours a la ligne ont était supprimés (je suis pas doué) -_-
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 déc. 2008 à 23:01
Salut,
Je viens de tester ton petit code. Tout l'écran devient blanc. Ta boucle infinie prend 99% du temps processeur. Essaie de mettre une image pour illustrer ton problème.
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
21 déc. 2008 à 23:21
tient voici une screenshot du rendu de mon programme (sous vista) :

http://artemis-ai.ifrance.com/sc.jpg
comme ont peut y voir seulement 3 portions de l'écran sont remplis de blanc

(je sais pr la boucle infinie mé cété pour l'exemple)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 déc. 2008 à 00:45
Je viens de tester sur Vista. Aucun problème.

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

Posez votre question
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
22 déc. 2008 à 00:48
je comprend vrément pas ... je suis dénué la, et bien c'est mon ordis qu'est buggé...

merci quand même
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 déc. 2008 à 13:14
Salut,

Faudrait appeler ReleaseDC(0, x) après avoir utilisé un x = GetDC(0).

Mais ça va pas corriger le problème.

Tu as essayé de désactiver aero ou je sais pas trop quoi ? Changé le thème du bureau (Viré l'image d'arrière plan...) ?
Kian_ix Messages postés 26 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 5 avril 2009
11 janv. 2009 à 17:00
[../auteur/MARECK666/687461.aspx

]Mareck666>
jai exactement le meme probleme que toi... ce dont je suis sur à 100%
c'est ce bug du SetPixel() est lié à windows vista, car j'ai testé sur
plusieurs pc sous XP et aucun ne reproduit ce bug, jai de plus
désactivé les styles aero de vista mais le bug continue, que ce soit
dans HWND_DESKTOP, ou dans une fenetre normale... grand mystère
Kian_ix Messages postés 26 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 5 avril 2009
11 janv. 2009 à 17:10
la seule solution que j'ai trouvé:

int SetPixelAlt(HDC hdc, int x, int y, int color) {
RECT rct;

rct.left = x;
rct.right = x+1;

rct.top = y;
rct.bottom = y+1;

FillRect(hdc, &rct, CreateSolidBrush(color));
return 0;
}
Kian_ix Messages postés 26 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 5 avril 2009
5 avril 2009 à 18:35
rajout d'un petit détail sur SetPixelAlt: un nombre d'appel à CreateSolidBrush supérieur à 100 provoque des réactions bizarres dans le programme, déclarer plutot le HBRUSH en global, et l'initialiser dans le winmain, et la plus de pb :)
DoctorNitro Messages postés 3 Date d'inscription samedi 28 mars 2009 Statut Membre Dernière intervention 16 juillet 2009
16 juil. 2009 à 19:39
Salut tout le monde.
y'a un bout de temps je faisait un programme pour dessiner direct sur l'ecran de sublimes images
" SetPixel(GetDC(0),i,j,RGB(i,j,i*j) "
(dans 2 boucles en i et j allant de 0 a 255)
sa marchait nickel sur mon vieux P3 cadencé a 600MHz avec WindowsMe mais lorsque je lance ce petit bout de code sur une machine plus puissante avec WindowsXP (Vista pas encor tenté) le PC bloc totalement (ça prend 99% du temps processeur) comme dit plus haut . Et apres 5 bonnes minutes je me retrouve avec le 1/4 de l'image souhaité avec retour du pc a un fonctionnement normal.
...? mais pour qu'elle raison sa marche sur du vieux et pas sur du neuf ????
---->au final je l'ai cree dans un fichier .bmp directement
ou bien dans un picture box

   for(int i=0; 255; i++)
 {
    for(int j=0; 255; j++)
{
    SetPixel(GetDC(0),i+50,j+50,RGB(i,j,i*j) 
//les +50 c'est pour centrer l'image modifier a votre convenance 
// essayer aussi pour voir RGB(i,i+j,j)
}
}

Rejoignez-nous