关于UpdateLayeredWindow调用失败返回0但是Getlasterror为0的问题

来源:互联网 发布:java 迭代器 编辑:程序博客网 时间:2024/06/05 17:21

最近,做一个异形半透明的窗体功能,使用的是比较大众化的方法:UpdateLayeredWindow来实现,实现细节是使用一张带有半透明效果的png图片。

在公司的台式机器上功能正常

但是回家再笔记本上发现窗体无法显示,估计是UpdateLayeredWindow函数有问题,发现UpdateLayeredWindow返回值为0,即返回错误,用GetLastError发现错误id也为0(即成功),顿时就很郁闷,于是我对比了一下公司台式机器和笔记本的操作系统版本,一致 均为sp3.然后推测估计是笔记本上关于GDI相关的系统文件不是最新的缘故.

 

问题就这样折磨了我一上午,于是google,发现有了一种方案成功解决了这个问题:在创建内存hbitmap的时候,一般的方法是使用如下

if(bmpMem.CreateCompatibleBitmap(pDC, m_nWndWidth, m_nWndHeight))
  {
      dcMem.SelectObject(&bmpMem);

//....

}

我估计可能是我系统文件原因导致在我的机器上这一步出现了问题,导致后面的UpdateLayeredWindow出错,于是改成一下方案:

CBitmap bmpMem;
  BITMAPINFOHEADER stBmpInfoHeader = { 0 };  
  int nBytesPerLine = ((m_nWndWidth* 32 + 31) & (~31)) >> 3;
  stBmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);  
  stBmpInfoHeader.biWidth = m_nWndWidth;  
  stBmpInfoHeader.biHeight = m_nWndHeight;  
  stBmpInfoHeader.biPlanes = 1;
  stBmpInfoHeader.biBitCount = 32;  
  stBmpInfoHeader.biCompression = BI_RGB;  
  stBmpInfoHeader.biClrUsed = 0;  
  stBmpInfoHeader.biSizeImage = nBytesPerLine * m_nWndHeight;   
  
  PUINT32 pvBits = NULL;  
  HBITMAP hBitMap = ::CreateDIBSection(NULL, (PBITMAPINFO)&stBmpInfoHeader, DIB_RGB_COLORS, (LPVOID*)&pvBits, NULL, 0);
  SelectObject(dcMem.GetSafeHdc(), hBitMap);

 

成功...