关于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);
成功...
在公司的台式机器上功能正常
但是回家再笔记本上发现窗体无法显示,估计是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);
成功...
相关文章推荐
- WIN7上UpdateLayeredWindow执行失败,getlasterror返回307的问题解决方法
- UpdateLayeredWindow()失败,GetLastError()返回0
- GDI+ / PNG 实现半透明窗口,正常情况下没有问题 将系统设置为16位色后UpdateLayeredWindow函数失败,GetLastError返回8(ERROR_NOT_ENOUGH_MEMORY)
- OpenProcess调用失败,GetLastError返回5
- CreateBitmapIndirect() GetLastError() 返回 错误的参数 创建失败原因
- 关于VS2005 调用WebService返回发送请求数据失败问题
- windows 问题 LoadLibrary失败,GetLastError= 193
- CreateFileMapping调用失败,GetLastError返回值为1006
- 如何解决加载动态链接库DLL失败,返回0,GetLastError返回错误码126
- TransactNamedPipe函数在切换线程时失败,GetLastError 返回 231。 再次 Read 成功。
- 打开虚拟串口COM18失败,GetLastError返回2
- Creat 失败,getlasterror返回10093
- 关于facebook接口调用返回unknow error的问题
- 关于定位时,getLastKnownLocation返回值为null所碰到的问题
- 关于virtualbox不能为虚拟电脑启动一个新任务报错 GetLastError=1790(其他错误id也可以一试)的问题
- CreateDirectory(…)执行失败,GetLastError()返回错误码5
- 打开虚拟串口COM18失败,GetLastError返回2
- dll之loadbitmap失败 getlasterror返回1813 1814的解决
- LoadLibrary失败,getlasterror返回126的心得
- win7下使用共享内存方式CreateFileMapping返回GetLastError总是0x5的问题解决