最近,做一个异形半透明的窗体功能,使用的是比较大众化的方法: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);
成功...