Newsgroup: it.comp.programmare.win32
Titolo: Bitmap

Salve, 
sto scrivendo un applicativo con VC6.0, uso VFW.H ma non uso MFC.
Ho un buffer con un bitmap, diciamo RGB24, devo aggiungere delle
scritte in sovraimpressione, tipo data e ora, e salvare il bitmap su
un file. 
NON so come modificare il contenuto del buffer "incollandoci" sopra le
scritte. StretchDIBits() non credo funzioni.
Grazie
Marco

scritte. StretchDIBits() non credo funzioni.
Lo carichi in un DC di memoria , ci scrivi sopra con TextOut e lo
salvi su file come una DIB .

 wrote:


 ha scritto nel messaggio 
news:c1l1815k3k25sc4e1...@4ax.com...

se devi anche stretchare il bitmap puoi usare questo:
supponendo che iPack contenga le tue info da aggiungere
pTarget deve essere già allocato e a sufficienza per contenere il risultato
//-----------------------------------------------------------
bool addInfo(const infoPack& iPack, LPBYTE pTarget, int tWidth, int tHeight, 
LPBYTE pSource, int sWidth, int sHeight)
{
  HDC hdc = GetDC(0);
  HDC mdc = CreateCompatibleDC(hdc);
  HBITMAP hBmp = CreateCompatibleBitmap(hdc, tWidth, tHeight);
  HGDIOBJ oldObj = SelectObject(mdc, hBmp);
  BITMAPINFOHEADER bmih;
  memset(&bmih, 0, sizeof(bmih));
  bmih.biSize = sizeof(BITMAPINFOHEADER);
  bmih.biWidth = tWidth;
  bmih.biHeight = tHeight;
  bmih.biPlanes = 1;
  bmih.biBitCount =  24;
  bmih.biCompression = BI_RGB;
  bmih.biSizeImage = ((tWidth * 3 + 3) & ~3) * tHeight;
//----- 1
  int oldMode = SetStretchBltMode(mdc, HALFTONE);
  StretchDIBits(mdc, 0, 0, tWidth, tHeight, 0, 0, sWidth, sHeight, pSource, 
(LPBITMAPINFO)&bmih,
        DIB_RGB_COLORS, SRCCOPY);
  SetStretchBltMode(mdc, oldMode);
//----- /1
  add_info(mdc, iPack, tWidth, tHeight);
  bool success = GetDIBits(mdc, hBmp, 0, tHeight, pTarget, 
(LPBITMAPINFO)&bmih, DIB_RGB_COLORS);
  SelectObject(mdc, oldObj);
  DeleteObject(hBmp);
  DeleteDC(mdc);
  ReleaseDC(0, hdc);
  return success;
}
-------------------------------
Se invece non cambiano le dimensioni al posto della zona 1 /1
puoi usare la SetDIBits per copiarci il tuo bitmap 


poi del target
+ bmih.biWidth = tWidth;
+  bmih.biHeight = tHeight;
+  bmih.biSizeImage = ((tWidth * 3 + 3) & ~3) * tHeight;


Grazie mille, sta funzionando!!
MA...... 
Questo codice opera sulla finestra del Desktop; non riesco invece aa
avere un DeviceContest che "punti" alla HWND della mia applicazione,
esiste un modo?
Mi sono aggiustato catturando una sottoporzione del desktop con
BitBlt(), ma esiste qualcosa di piu diretto e pulito?
Grazie ancora
Marco


 ha scritto nel messaggio 
news:shn381tmcv9s0tl0l...@4ax.com...


Anche usando GetWindowDC( miaHWDN ), con la mia finestra valida e
funzionante e tutto il resto, il DeviceContest creato rimane il
desktop, e me ne accorgo perche GetDeviceCaps( ... ) mi dice che ha
dimensioni 1024*768, e non 320*240 come la mia finestra!
Grazie!!!!!!!!
Marco


 Marco
Deve essere così, stai chiedendo le capacità del device che è lo schermo.
Il DC della window è un sottoinsieme di quello principale (infatti non puoi 
avere due window distinte con diverse risoluzioni).
Se mi dici cosa ti serve sapere esattamente si può trovare il metodo.
Se sono le informazioni sulla dimensione e posizione c'è GetWindowRect() per 
la window intera, GetClientRect() per l'area client, ecc. 

Direi che ha funzionato, grazie e alla prox!
Marco
