/
// DDB->DIB
HANDLE _dibFromBitmap(HBITMAP hBitmap)
{
BITMAP bm;
BITMAPINFOHEADER bi;
BITMAPINFOHEADER *lpbi;
DWORD dwLen;
HANDLE hDIB;
HDC hDC;
WORD wBits;
HPALETTE hPal=NULL;
if (!hBitmap)
return NULL;
::GetObject (hBitmap, sizeof (bm), (LPSTR)&bm);
wBits = bm.bmBitsPixel;
bi.biSize = sizeof (BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBits;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwLen = bi.biSize + PALETTESIZE ((LPSTR) &bi);
hDIB = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE,dwLen);
if (!hDIB)
return NULL;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
*lpbi = bi;
HWND hWnd= GetFocus();
if(!hWnd)
{//load default system palette
hPal = (HPALETTE)GetStockObject (DEFAULT_PALETTE);
hDC = GetDC (NULL);
hPal = SelectPalette (hDC, hPal, FALSE);
RealizePalette(hDC);
}
else
{
//or get palette from focused window
HDC hDCw = GetDC (hWnd);
hPal = SelectPalette (hDCw, (HPALETTE)GetStockObject (DEFAULT_PALETTE), FALSE);
hDC = GetDC (NULL);
hPal = SelectPalette (hDC, hPal, FALSE);
RealizePalette(hDC);
SelectPalette (hDCw, hPal, FALSE);
ReleaseDC(hWnd,hDCw);
}
// calculate the biSizeImage
GetDIBits (hDC,
hBitmap,
0,
(WORD) bi.biHeight,
NULL,
(LPBITMAPINFO) lpbi,
DIB_RGB_COLORS);
bi = *lpbi;
GlobalUnlock(hDIB);
// If the driver did not fill in the biSizeImage field,
// make one up
if (bi.biSizeImage == 0)
{
bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * wBits) * bm.bmHeight;
if (bi.biCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
DWORD sl =dwLen;
HGLOBAL hPtr =hDIB;
dwLen = bi.biSize + PALETTESIZE((LPSTR)&bi) + bi.biSizeImage;
// if you have plans to use DDE or clipboard, you have
// to allocate memory with GMEM_DDESHARE flag
if(!(hDIB = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE,dwLen)))
{
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
GlobalFree(hPtr);
return NULL;}
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
LPBITMAPINFOHEADER lpS=(LPBITMAPINFOHEADER)GlobalLock(hPtr);
CopyMemory(lpbi,lpS,sl);
GlobalUnlock(hPtr);
GlobalFree(hPtr);
// actually fill lpBits
if (GetDIBits( hDC,
hBitmap,
0,
(WORD) bi.biHeight,
(LPSTR) lpbi + (WORD) lpbi->biSize + PALETTESIZE((LPSTR) lpbi),
(LPBITMAPINFO) lpbi, DIB_RGB_COLORS) == 0)
{
GlobalUnlock (hDIB);
hDIB = NULL;
SelectPalette (hDC, hPal, FALSE);
ReleaseDC (NULL, hDC);
return NULL;
}
bi = *lpbi;
GlobalUnlock (hDIB);
SelectPalette (hDC, hPal, FALSE);
ReleaseDC (NULL, hDC);
//OK
return hDIB;
}