您的位置:首页 > 编程语言 > Go语言

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

2012-06-17 12:39 597 查看
最近,做一个异形半透明的窗体功能,使用的是比较大众化的方法: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);

 

成功...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  colors null google bi