The sample demo workspace includes two projects: DIBSectionTest for Win32
environments, and DIBSectionTestCE for CE environments that demonstrate the
DIBSection wrapper. You will need the CE SDKs from Microsoft to be installed before you can build DIBSectionTestCE.dsw.
There is also a version of the DIBSection wrapper ported by Kenny Goers with no dependancies on MFC. This version is currently slightly out of sync with the MFC version, and is provided as a convenience only.
Device Independant Bitmaps (DIBs) offer a means to manipulate and display
bitmaps in a form that is independant of the current display setting of your
computer. They are also the format of the standard windows .BMP file, and so
having a means to load, display and modify DIBs is very handy.
Win32 offers many different ways of dealing with DIBs, including the standard
DIB functions such as
DrawDib functions, and the GDI functions such as
for use with DIBsections.
However, when working in a CE environment, many of the usual functions we
know and love have been discarded in an effort to reduce the size of the overall
OS, and as such we are only left with the possibility of using DDB's (via
or DIBSections. This is not too much of a handycap though since DIBSections are,
in a way, superior to plain DIBs in that they have an associated
and hence can be manipulated via the GDI functions such as
Furthermore, the handle to a DIBSection can be selected into a memory DC and then
drawn to directly using the
Line etc GDI functions.
This is far easier than accessing the bits of a DIB yourself and plotting the pixels
one by one.
The only problem with DIBsections, from an MFC programmers point of view, is
that there is no DIBSection wrapper. Jeff Prosise, in his book Programming Windows
95 with MFC discusses DIBSections and how great they are, but states that because
the next version of MFC will have a DIBSection wrapper class, there is no
point in him supplying one in his book. Oops! Several updates to MFC have come and gone
since that book was written and still there is no sign of a DIBSection wrapper
With the advent of CE, DIBSections have become even more important. Here I
CDIBSectionLite class - a DIBSection wrapper class for Win32
and WinCE platforms. This class provides a simple interface to DIBSections including
loading, saving and displaying DIBSections. Full palette support is provided for Win32
and CE 2.11 and above.
Note that CE introduces a new bitmap depth, namely 2 bits per pixel. This is for
older 4-level grey scale devices.
CDIBSectionLite supports this pixel
depth in CE builds only.
Creating and displaying DIBSections
The first step in creating a DIBSection is to fill out a
structure. If you are creating a DIBSection from scratch then just fill in
these values with whatever you like. If, on the other hand, you wish to
convert a DDB to a DIBSection then your best friend is the GetDIBits function.
It fills in the
BITMAPINFOHEADER structure for you by querying the values of
the supplied bitmap.
Unfortunately CE does not support this function and so you must do this yourself.
While this is no great drama it does make it a little more difficult to get the
colour table info from the supplied bitmap. Microsoft have kindly helped us programmers
along by writing the KB article HOWTO: Get the Color Table of a DIBSection in Windows
CE. One limitation of the code in the KB article is that it only extracts color
table info for bitmaps that are DIBSections themselves.
gets around this by synthesizing a half-tone color table for DDB's without color
Once you have the
BITMAPINFOHEADER structure, including the color table entries
filled in, simply call
CreateDIBSection. This funtion will return a
handle plus a pointer to the actual image bits. What more could you ask for!
To actually display the DIBSections you simply use the tried and true windows
GDI functions (BitBlt etc). Some functionality is lost in CE, such as GDIFlush
and SetStretchBltMode, but on the whole a HBITMAP created as a DIBSection is no
different to use than a HBITMAP from a DDB.
CDIBSectionLite class includes support for the DrawDib functions. These provide
high speed display as well as dithering, but unfortunately are not available on CE.
To toggle between using the windows GDI and the DrawDib routines, use the
This class is very simple to use and wraps all the messy plumbing from view.
The bitmap can be set using either
SetBitmap() (which accepts either a Device
dependant or device independant bitmap, or a resource ID) or by using
which allows an image to be loaded from disk. To display the bitmap simply use
Draw or Stretch.
CDIBSectionLite API includes methods for loading and
displaying images, methods to extract information about the image, as well as
palette options for getting and setting the current palette. Note that the
palette methods are only available in Win32 or in CE 2.11 or later.
HBITMAP GetSafeHandle() const operator HBITMAP() const CSize GetSize() const int GetHeight() const int GetWidth() const int GetPlanes() const int GetBitCount() const LPVOID GetDIBits() LPBITMAPINFO GetBitmapInfo() DWORD GetImageSize() const LPBITMAPINFOHEADER GetBitmapInfoHeader() LPRGBQUAD GetColorTable()
BOOL SetColorTable(UINT nNumColors, RGBQUAD *pColors);
BOOL SetPalette(CPalette* pPalette);
BOOL SetLogPalette(LOGPALETTE* pLogPalette);
BOOL SetBitmap(UINT nIDResource);
BOOL SetBitmap(LPCTSTR lpszResourceName);
BOOL SetBitmap(HBITMAP hBitmap, CPalette* pPalette = NULL);
BOOL SetBitmap(LPBITMAPINFO lpBitmapInfo, LPVOID lpBits);
BOOL Load(LPCTSTR lpszFileName); BOOL Save(LPCTSTR lpszFileName); BOOL Copy(CDIBSectionLite& Bitmap);
BOOL Draw(CDC* pDC, CPoint ptDest, BOOL bForceBackground = FALSE);
BOOL Stretch(CDC* pDC, CPoint ptDest, CSize size, BOOL bForceBackground = FALSE);
BOOL SetDither(BOOL bDither); BOOL GetDither();
- 4 May 2000 - The class was updated with corrections from Jim Miller
of 3DFX to correct a bug with compressed bitmaps.
- 20 Sep 2000 - Fixed Bug fix in Save() (saving 4 bytes too many - Tadeusz Dracz)
Allowed lpBits to be NULL in SetBitmap - Don Grasberger
Fixed NumColorEntries bug - Itay Szekely
Fixed buffer overrun bug in Load() - Itay Szekely
- 5 Apr 2001 - Fix for 16/32 bpp bitmaps for PocketPC's (Dan Robbins)
Non-MFC port (Kenny Goers)
- 22 May 2001 - Fix for missing break in 24bpp case of NumColorEntries (Steve Kramp)
Chris is the Co-founder, Administrator, Architect, Chief Editor and Shameless Hack who wrote and runs The Code Project. He's been programming since 1988 while pretending to be, in various guises, an astrophysicist, mathematician, physicist, hydrologist, geomorphologist, defence intelligence researcher and then, when all that got a bit rough on the nerves, a web developer. He is a Microsoft Visual C++ MVP both globally and for Canada locally.
His programming experience includes C/C++, C#, SQL, MFC, ASP, ASP.NET, and far, far too much FORTRAN. He has worked on PocketPCs, AIX mainframes, Sun workstations, and a CRAY YMP C90 behemoth but finds notebooks take up less desk space.
He dodges, he weaves, and he never gets enough sleep. He is kind to small animals.
Chris was born and bred in Australia but splits his time between Toronto and Melbourne, depending on the weather. For relaxation he is into road cycling, snowboarding, rock climbing, and storm chasing.