RE: [GD-Windows] In memory bitmap to HBITMAP
Brought to you by:
vexxed72
From: Andrew G. <And...@ho...> - 2001-12-07 10:40:47
|
Ahh, remembered what the problem was :) CreateCompatibleDC creates a memory DC. By default memory DC's have a 1x1 monochrome surface so when you call CreateDIBitmap you are creating a bitmap which is the same type as that DC, e.g monochrome. Try passing in the DC of your window instead to CreateDIBitmap. To explain further; (stuff you may/may not know) In Windows DCs are your interface for drawing to the object they contain. Screens, Bitmaps and so on. When you call CreateCompatibleDC you are returned a compatible but empty DC (well, 1x1 b/w) that you can then use to draw to. Compatible doesn't mean format-wise (after all you can BitBlt between DCs of different colour depths), it means compatible in some device way, in this case compatible with the screen. However until you place something into that DC then you are using the default 1x1 monochrome surface. For instance if you wanted to draw text to a HBITMAP using GDI you put that hbmp into the DC first so you are using that. Something like... // create a dc HDC hdc = CreateCompatibleDC(); // select the bitmap into the dc HGDIOBJ hOld = SelectObject(hdc, hbmp); // draw your text DrawText(hdc, "blah blah", ...); // remove the hbmp from the dc SelectObject(hdc, hOld); // delete the dc DeleteDC(hdc); Another example. To solve your problem you could do HDC hdc = CreateCompatibleDC(); // create a memory DC HBITMAP = CreateBitmapIndirect(); // creates an empty bitmap of the specified dimensions and depth // select the new bmp into the DC HGDIOBJ hOld = SelectObject(hdc, hbmp); CreateDIBitmap(hdc, ...); Now at this point you have loaded your new bitmap with the same color depth as the bitmap you created with CreateBitmapIndirect(), because that was format of the bitmap in the DC you used with CreateDIBitmap, not the default 1x1 monochrome one. Of course this isn't always good method because you are allocating extra resources with CreateBitmapIndirect, however this technique is useful for the case where the users desktop is running in 16-bit color and you want to work with 24-bit images. It's good to think of a DC as an interface you use to draw on something. In the case of WM_PAINT that 'something' is the screen, in the case of memory DCs it is the bitmap you place in them with SelectObject. Hope this helps somewhat. Andrew Grant Hothouse Creations > -----Original Message----- > From: Andrew Grant [mailto:And...@ho...] > Sent: 07 December 2001 09:57 > To: gam...@li... > Subject: RE: [GD-Windows] In memory bitmap to HBITMAP > > > I've had this before, I can't remember what caused it but it > turned out to > be a "duh" error on my part. Code Guru (www.codeguru) is a > great site for > all sorts of GDI programming trickery. It's MFC based but the > techniques are > sound and it's not a great deal of pain to implment any of > the samples in > Win32. In this case > http://www.codeguru.com/bitmap/bitmap_from_bmp.shtml. > > On another note, have you thought about using LoadImage() > instead rather > than doing it manually? > > Andrew Grant > Hothouse Creations > > > > > -----Original Message----- > > From: Brian Hook [mailto:bri...@py...] > > Sent: 07 December 2001 02:04 > > To: gam...@li... > > Subject: [GD-Windows] In memory bitmap to HBITMAP > > > > > > I'm struggling with something fairly basic -- I want to > load a BMP out > > of a compressed file, convert to an HBITMAP, then blit it > into a DDraw > > surface. I know how to do the first and last part, but the > middle is > > causing problems. Even worse, I'm not getting any errors. > > > > Loading the bitmap doesn't seem to be a problem. I load it > > up and parse > > and find the BITMAPFILEHEADER and BITMAPINFOHEADER no probs. I also > > locate the raw bits no problem (and inspect with the > debugger to make > > sure I'm getting what I think I'm getting -- in this case, solid > > magenta). Looks fine. > > > > The next step is to create a DC compatible with the desktop: > > > > HDC hDC = CreateCompatibleDC( NULL ); > > > > I then create a HBITMAP compatible with DC, and using the > > bits I pulled: > > > > HBITMAP hbm; > > > > hbm = CreateDIBitmap( hDC, lpBMIH, CBM_INIT, lpBits, lpBMIH, > > DIB_RGB_COLORS ); > > > > lpBMIH are simply pointers to the appropriate > BITMAPINFOHEADER. They > > have correct values in them. The bitmap is returned successfully. > > > > To verify things, I grab the bits out of the Bitmap to make sure > > everything is cool: > > > > GetDIBits( hDC, hbm, 0, iHeight, tempbuffer, &bmi, DIB_RGB_COLORS ); > > > > It returns the correct number of scan lines, but tempbuffer > is filled > > with black. This means either the CreateDIBitmap() filled in > > the bitmap > > with black, or the GetDIBits() failed somehow. I can't > > figure out which > > is the real culprit, but the bitmap is pretty much a black square. > > > > Any suggestions on how to hunt this down? > > > > > > > > > This email is covered by the following disclaimer, please read before > accepting this email. http://www.hothouse.org/disclaimer/ > > _______________________________________________ > Gamedevlists-windows mailing list > Gam...@li... > https://lists.sourceforge.net/lists/listinfo/gamedevlists-windows > This email is covered by the following disclaimer, please read before accepting this email. http://www.hothouse.org/disclaimer/ |