Newsgroup: it.comp.programmare.win32
Titolo: VC/SDK: CreateDIBSection

Voglio creare una DIB per scrivere "disegnare" direttamente nella memoria
senza passare per un CDC (uso routine VGA-like), ma purtroppo la
CreateDIBSection() fallisce . Mi ritorna l'handler della bitmap a 0 e il
puntatore alla memoria immagine a 0.
La chiamo cosi':
 // bmi e' una union per creare una BITMAPINFO con color table a 256 colori
  bmi.v.bmiHeader.biSize=sizeof(BITMAPINFO);
  bmi.v.bmiHeader.biWidth=800;
  bmi.v.bmiHeader.biHeight=600;
  bmi.v.bmiHeader.biPlanes=1;
  bmi.v.bmiHeader.biBitCount=8;
  bmi.v.bmiHeader.biCompression=BI_RGB;
  bmi.v.bmiHeader.biSizeImage=0;
  bmi.v.bmiHeader.biXPelsPerMeter=1000;
  bmi.v.bmiHeader.biYPelsPerMeter=1000;
  bmi.v.bmiHeader.biClrUsed=0;
  bmi.v.bmiHeader.biClrImportant=3;
  RGBQUAD rgb_code={0, 0, 0, 0};
  for(i=0; i<256; ++i)
    {
      rgb_code.rgbGreen=BYTE(i);
      bmi.v.bmiColors[i]=rgb_code;
    }
  void *pvBits;
  HBITMAP h_buffer=CreateDIBSection(
    tmp_dc->m_hDC,    // questo e il DC della finestra (CWnd->GetDC)
    &bmi.bmi,
    DIB_RGB_COLORS,
    &pvBits, 0, 0);
  // Dopo la chiamata h_buffer, e pvBits sono a 0
 // Cerco di attaccare una CBitmap alla DIB, in modo da poterla usare con un
CDC per "blittare" sulla finestra
  BITMAP bm;
  GetObject(h_buffer, sizeof(bm), &bm);
  CBitmap w_bitmap_buffer;
  w_bitmap_buffer.CreateBitmapIndirect(&bm);
  ....
Qualche suggerimento ?
C'e' un altro modo per creare una memory bitmap a 256 colori, magari usando
solo CBitmap (ho la necessita di ricavare il puntatore alla memoria) ?
Saluti, Alberto.

Saluti, Alberto.
Saluti,
    Mardy

 Forse mi sbaglio, ma mi pare che funzioni solo Windows NT.
No, funziona anche su Win95 e successive versioni.
Alex

   bmi.v.bmiHeader.biSize=sizeof(BITMAPINFO);
Ecco l'errore; usa, invece, sizeof(BITMAPINFOHEADER).
Alex

 wrote in message
R3EX3.51678$s17.5...@typhoon.libero.it...

Ok, adesso CreateDIBSection() funziona... in compenso non riesco ad
associarla ad una CBitmap, almeno credo. Quando "blitto" sulla finestra non
succede nulla. O sbaglio ad associare, o non si puo' fare. Dall'help VC non
e' chiaro se, quando creo una CBitmap (CreateBitmapIndirect()) a partire da
una BITMAP ottenuta da una CreateDIBSection(), si limita a copiare dalla
bitmap originale o usa la stessa memoria. Ho provato ad usare direttamente
la CBitmap, usando CreateBitmapIndirect() con una BITMAP riempita da me e
con puntatore ai bit dell'immagine uguale a zero, nella speranza di poter
recuperare l'indirizzo della memoria con una CBitmap::GetBitmap(), ma la
struttura ritornata ha il capo bmBits (puntatore alla memoria della bitmap)
uguale a 0.
Avete qualche suggerimento ?
Il mio problema di base rimane sempre quello di tracciare (scrivendo
direttamente in memoria) da una bitmap a 256 colori sul DC di una finestra,
indipendentemente dal numero di colori della finestra. La bitmap deve essere
accessibile come memoria. Preferirei non usare DirectX.
Grazie, Alberto.


Ho risolto facendo ricorso al solito CodeGuru. L'uso diretto della DIB
Section funziona. Il problema era nella la mappatura dei colori e
nell'associare l'HBITMAP ad una CDC, risolto passando per m_hDC (senza usare
una CBitmap). Il tutto facendo riferimento ai contributi di CodeGuru,
sezione bitmap.
Grazie, Alberto.