Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [WinApi] Creazione Bitmap con palettes
Forum - C/C++ - [WinApi] Creazione Bitmap con palettes

Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 8:58
Lunedì, 17/05/2010
Ciao a tutti :D
Negli ultimi 3 giorni mi sono cimentato un pò nella programmazione con le WinApi (finalmente ho lasciato perdere i programmini in console e la pesantezza (rispetto al C) del C#).
Dove mi sono bloccato io è il creare un'immagine in runtime a 16 o 256 colori con una palette specifica.
I passaggi che devo fare risiedono tutti in un WM_PAINT:
- Elaboro i dati e metto tutto in un buffer
- Ne elaboro altri ricavando un array di tipo int dove contengo i colori rgb
? Creo un immagine Bitmap di tot pixel dal buffer usando l'array di colori
- Creo un secondo DC usango CreateCompatibleDC
- Seleziono la bitmap creata precedentemente con il nuovo DC
- Drawwo tutto su finestra usando il potentissimo BitBlt

e mi blocco proprio dove ho messo il '?'. Somebody can help me?

PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 18:46
Lunedì, 17/05/2010
Ciao xeeynamo!

Puoi postare il codice che hai scritto in WM_PAINT?

Ultima modifica effettuata da Dax89 il 17/05/2010 alle 18:46


PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 20:34
Lunedì, 17/05/2010
Testo quotato

Postato originariamente da Dax89:

Ciao xeeynamo!

Puoi postare il codice che hai scritto in WM_PAINT?


Certo ;)
Codice sorgente - presumibilmente C/C++

  1. case WM_PAINT:
  2.                 hdc = BeginPaint(hWnd, &ps);
  3.  
  4.                 BYTE data[0x40];
  5.                 for(int i=0; i<0x40; i++)
  6.                         data[i] = rand()%0x100;
  7.                 BYTE pal[0x10];
  8.                 for(int i=0; i<0x10; i++)
  9.                         pal[i] = (rand()%0x100) | ((rand()%0x100)<<8) | ((rand()%0x100)<<16);
  10.                 dcBmp = CreateCompatibleDC(hdc);
  11.                 hBmp = ????
  12.                 SelectObject(dcBmp, hBmp);
  13.                 BitBlt(hdc, 0, 0, 8, 8, dcBmp, 0, 0, SRCCOPY);
  14.  
  15.                 EndPaint(hWnd, &ps);
  16.                 break;



Genero una bmp e delle palette completamente casuali giusto per testare se il tutto si vedrà sull'applicazione una volta trovata la soluzione, poi metterò il contenuto che mi serve davvero. l'hBmp è l'handle che conterrà la bitmap. Dove ci sono i punti interrogativi andrà la funzione o la serie di algoritmi che mi permetterà di creare la bitmap a modo mio. Le variabili fuori lo switch sono queste
Codice sorgente - presumibilmente Plain Text

  1. PAINTSTRUCT ps;
  2.         HDC hdc, dcBmp;
  3.         HBITMAP hBmp;


PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 18:28
Martedì, 18/05/2010
Per le Palette, hai dato un'occhiata queste due funzioni?

http://msdn.microsoft.com/en-us/library/dd183507(v=VS.85). ...
http://msdn.microsoft.com/en-us/library/dd162958(v=VS.85). ...

Se vuoi creare (e non caricare da file) una Bitmap, puoi usare CreateBitmap():

http://msdn.microsoft.com/en-us/library/dd183485(VS.85).aspx

:)

Ultima modifica effettuata da Dax89 il 18/05/2010 alle 18:29


PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 20:27
Martedì, 18/05/2010
Testo quotato

Postato originariamente da Dax89:

Per le Palette, hai dato un'occhiata queste due funzioni?

http://msdn.microsoft.com/en-us/library/dd183507(v=VS.85). ...
http://msdn.microsoft.com/en-us/library/dd162958(v=VS.85). ...

Se vuoi creare (e non caricare da file) una Bitmap, puoi usare CreateBitmap():

http://msdn.microsoft.com/en-us/library/dd183485(VS.85).aspx

:)



Già viste, però non ho capito come si utilizzano e googlando neanche ho trovato niente... CreatePalette gli passi come parametro LOGPALETTE che contiene palVersion e palNumEntries che non sò cosa siano e il PALETTEENTRY che accetta solo UN colore. Ok, facciamo finta che ho capito come si utilizza la funzione.. Seleziono la palette giusto? SelectPalette(hdc, la palette, 0); essa viene memorizzata nell'hdc e quando carico l'immagine in bmp grazie a CreateBitmap essa avrà i colori definiti dalla palette? Forse si, mi sono dato la risposta da solo, ma continuo a non capire come faccio a passare una serie di colori a CreatePalette...

PM Quote