在WINCE下,如果创建的位图与屏幕设备格式不一样,将会导致BitBlt函数极为缓慢,因此需要创建一幅16位色565格式位图,用此方法创建出的位图可以提供1ms的快速BitBlt绘制。当然,如果设备不是565颜色格式的,更改代码中的颜色掩码位bmiColors就可以了。
// /// @brief 创建一幅缓存图像。 /// @param[out] pHBitmap 生成的位图句柄。 /// @param[out] pData 生成的位图中的数据位置。 /// @param[in] hDC 目标DC句柄。 /// @param[in] width 位图宽度。 /// @param[in] height 位图高度。 /// @param[in] bitCount 每个像素占多少个bit。 /// @attention 创建的位图是无压缩格式的。 /// @author Loongee /// @date 2010/01/15 // void CreateBufferBitmap(HBITMAP* pHBitmap, void** pData, HDC hDC, LONG width, LONG height, WORD bitCount) { BITMAPINFO& bmpInfo = *(BITMAPINFO*)new BYTE[sizeof(bmpInfo) + sizeof(RGBQUAD) * 3]; bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = width; bmpInfo.bmiHeader.biHeight = height; bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = bitCount; if (bitCount == 16) { bmpInfo.bmiHeader.biCompression = BI_BITFIELDS; *(DWORD *)(&bmpInfo.bmiColors[0]) = 0xF800; *(DWORD *)(&bmpInfo.bmiColors[1]) = 0x07E0; *(DWORD *)(&bmpInfo.bmiColors[2]) = 0x001F; } else { bmpInfo.bmiHeader.biCompression = BI_RGB; } bmpInfo.bmiHeader.biSizeImage = 0; bmpInfo.bmiHeader.biXPelsPerMeter = 1000; bmpInfo.bmiHeader.biYPelsPerMeter = 1000; bmpInfo.bmiHeader.biClrUsed = 0; bmpInfo.bmiHeader.biClrImportant = 0; *pHBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS , pData, NULL, 0); delete[] (BYTE*)&bmpInfo; }