Setpixel couleur

Résolu
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012 - 23 juin 2008 à 17:27
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012 - 23 juin 2008 à 18:01
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

Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 juin 2008 à 17:53
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
2
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012
23 juin 2008 à 18:01
Merci, je regarde sa demain ;)

Have Fun ...
0
Rejoignez-nous