我是靠谱客的博主 大气白云,最近开发中收集的这篇文章主要介绍GDI+ / PNG 实现半透明窗口,正常情况下没有问题 将系统设置为16位色后UpdateLayeredWindow函数失败,GetLastError返回8(ERROR_NOT_ENOUGH_MEMORY) ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题出在你创建的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;

最后

以上就是大气白云为你收集整理的GDI+ / PNG 实现半透明窗口,正常情况下没有问题 将系统设置为16位色后UpdateLayeredWindow函数失败,GetLastError返回8(ERROR_NOT_ENOUGH_MEMORY) 的全部内容,希望文章能够帮你解决GDI+ / PNG 实现半透明窗口,正常情况下没有问题 将系统设置为16位色后UpdateLayeredWindow函数失败,GetLastError返回8(ERROR_NOT_ENOUGH_MEMORY) 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部