GDI+ / PNG 实现半透明窗口,正常情况下没有问题 将系统设置为16位色后UpdateLayeredWindow函数失败,GetLastError返回8(ERROR_NOT_ENOUGH_MEMORY)

本文解决了一个常见问题:在使用CreateCompatibleBitmap创建位图时导致Alpha通道丢失。通过使用CreateDIBSection并设置正确的BITMAPINFOHEADER参数,可以创建包含Alpha通道的32位位图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题出在你创建的Bitmap上,一般情况下用CreateCompatibleBitmap来创建,但是这时候创建的Bitmap跟DC走了,是16位色的,这样就会丢失了Alpha通道。所以应该这样:

 

  RECT rtWnd;
  hWnd = GetSafeHwnd();
  if(hWnd == NULL)
   break;
  if(!::GetWindowRect(hWnd, &rtWnd))
   break;

  hWndDC = ::GetDC(hWnd);
  if(hWndDC == NULL)
   break;

  hMemDC = ::CreateCompatibleDC(hWndDC);
  if(hMemDC == NULL)
   break;

 

  //hMemBitmap = ::CreateCompatibleBitmap(hWndDC, rtWnd.right - rtWnd.left, rtWnd.bottom - rtWnd.top); ////这样就会失败

 

  BYTE* pBits = NULL;
  BITMAPINFOHEADER bmih = {  sizeof (BITMAPINFOHEADER) };

  bmih.biWidth                =  rtWnd.right - rtWnd.left;
  bmih.biHeight                = rtWnd.bottom - rtWnd.top ;
  bmih.biPlanes                = 1 ;
  bmih.biBitCount              = 32;        //这里一定要是32
  bmih.biCompression          = BI_RGB ;
  bmih.biSizeImage            = 0 ;
  bmih.biXPelsPerMeter        = 0 ;
  bmih.biYPelsPerMeter        = 0 ;
  bmih.biClrUsed              = 0 ;
  bmih.biClrImportant          = 0 ;

  hMemBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&bmih, DIB_RGB_COLORS, (VOID**)&pBits, NULL, 0) ;


  if(hMemBitmap == NULL)
   break;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值