DDB2DIB

/
// 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值