Setpixel couleur [Résolu]

Signaler
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
-
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
-
Bonjour,

Je voudrais écrire dans ma fenêtre pixel par pixel. Pour cela je souhaite passer par une zone mémoire temporaire avant de la recopier (une fois tous les pixels modifier) sur l'écran. Je pense donc utilisé un HBITMAP mais j'ai un problème au niveau des couleurs. Dans le code suivant, je ne peux avoir que du noir ou du blanc. Comment avoir 256 couleurs et même plus? De plus, j'aimerai savoir si ce que j'ai fait vous paraît correct?

<hr size="2" width="100%" />LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT paintst;
        HDC memHdc;
        HBITMAP hBitmap;
       
        COLORREF color;
        int n;
 
    switch (message)                  /* handle the messages */
    {
        case WM_PAINT:
        //case WM_CREATE:
             hdc=BeginPaint(hwnd,&paintst);
             memHdc=CreateCompatibleDC(hdc);
             hBitmap = CreateCompatibleBitmap(memHdc,480,272);
             SelectObject(memHdc, hBitmap);
            
             color=0x00FFFF00; //0x00bbggrr
            
             for (n=10;n<100;n++)
                 SetPixel(memHdc,n,10, color);

             BitBlt(hdc,0,0,480,272,memHdc,0,0,SRCCOPY);
            return 0;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
<hr size="2" width="100%" />
Have Fun ...

2 réponses

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Salut


Voici un exemple qui marche:




LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)




{



HDC hdc;














static

HDC memHdc;





static

HBITMAP hBitmap;









COLORREF color;






int

n;












switch

(message) /* handle the messages */




{











case

WM_CREATE:









memHdc=CreateCompatibleDC(NULL);



HDC H;



H=GetDC(hwnd);



hBitmap = CreateCompatibleBitmap(H,480,272);



ReleaseDC(hwnd,H);



SelectObject(memHdc, hBitmap);









color=0x000000FF; //0x00bbggrr













for

(n=10;n<100;n++)







for

(int i=0;i<100;i++)




SetPixel(memHdc,n,i, color);






break

;







case

WM_PAINT:




PAINTSTRUCT paintst;



hdc=BeginPaint(hwnd,&paintst);



BitBlt(hdc,0,0,480,272,memHdc,0,0,SRCCOPY);



EndPaint(hwnd,&paintst);






return

0;







case

WM_DESTROY:





PostQuitMessage (0); /* send a WM_QUIT to the message queue */








break

;







default

: /* for messages that we don't deal with */







return

DefWindowProc (hwnd, message, wParam, lParam);




}






return

0;




}





Il faut creer ton HBitmap et ton memDC dans le message WM_CREATE et non pas dans le WM_PAINT. Le messaeg paint est envoyer en rafale et il est inutile de le faire a chaque fois. J'ai changer aussi ta maniere de les creer:



memHdc=CreateCompatibleDC(NULL);



HDC H;



H=GetDC(hwnd);



hBitmap = CreateCompatibleBitmap(H,480,272);


A+
Mon site internet : http://pistol.petesampras.free.fr
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012

Merci, je regarde sa demain ;)

Have Fun ...