|
关于在WinCE中使用GetDIBits的问题
[复制链接]
我在Windows下编写了一个位图保存程序,写好后将其移植到WinCE平台上运行出现了GetDIBits函数不被WinCE系统所支持,上网查询说是要使用其他的函数来替换该函数所实现的功能,可是我经过长时间的查找也没有找到合适的代码,请问我的这个问题该如何解决,最好能将如下问题代码改正后给我,万分感谢,分数不够可加分。
问题代码:
/*************************************************************************************************/
/* 位图文件保存函数(传入文件保存的绝对路径和文件名称)成功运行则返回TRUE */
/*************************************************************************************************/
BOOL CFile::SaveBMPFileFun(HBITMAP hBitmap, PTSTR FilePath, PTSTR FileTitle)
{
HDC hDC = ::CreateDC ((LPCWSTR)"DISPLAY",NULL,NULL,NULL) ;
int iBits = ::GetDeviceCaps (hDC, BITSPIXEL) * ::GetDeviceCaps (hDC, PLANES) ;//当前分辨率下每个像素所占字节数
::DeleteDC(hDC) ;
WORD wBitCount ; //位图中每个像素所占字节数
if (iBits <= 1)
wBitCount = 1 ;
else if (iBits <= 4)
wBitCount = 4 ;
else if (iBits <= 8)
wBitCount = 8 ;
else if (iBits <= 24)
wBitCount = 24 ;
else
wBitCount = iBits ;
DWORD dwPaletteSize=0 ; //调色板大小, 位图中像素字节大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD) ;
BITMAP bm ; //位图属性结构
::GetObject(hBitmap, sizeof(bm), (LPSTR)&bm) ;
BITMAPINFOHEADER bi ; //位图信息头结构
bi.biSize = sizeof(BITMAPINFOHEADER) ;
bi.biWidth = bm.bmWidth ;
bi.biHeight = bm.bmHeight ;
bi.biPlanes = 1 ;
bi.biBitCount = wBitCount ;
bi.biCompression = BI_RGB ; //BI_RGB表示位图没有压缩
bi.biSizeImage = 0 ;
bi.biXPelsPerMeter = 0 ;
bi.biYPelsPerMeter = 0 ;
bi.biClrUsed = 0 ;
bi.biClrImportant = 0 ;
DWORD dwBmBitsSize = ((bm.bmWidth * wBitCount+31)/32) * 4 * bm.bmHeight ;
/*为位图内容分配内存*/
HANDLE hDib = GlobalAlloc (GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)) ;
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib) ;
*lpbi = bi ;
HANDLE hPal = GetStockObject (DEFAULT_PALETTE) ; // 处理调色板
HANDLE hOldPal = NULL ;
if (hPal)
{
hDC = GetDC (NULL) ;
hOldPal = SelectPalette (hDC, (HPALETTE)hPal, FALSE) ;
RealizePalette (hDC) ;
}
GetDIBits (hDC, hBitmap, 0, (UINT) bm.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值
if (hOldPal) // 恢复调色板
{
SelectPalette (hDC, (HPALETTE)hOldPal, TRUE) ;
RealizePalette (hDC) ;
ReleaseDC (NULL, hDC) ;
}
BITMAPFILEHEADER bmfHdr ; // 位图文件头结构
bmfHdr.bfType = 0x4D42 ; // "BM" // 设置位图文件头
DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize
+ dwBmBitsSize ; // 计算位图的大小
bmfHdr.bfSize = dwDIBSize ;
bmfHdr.bfReserved1 = 0 ;
bmfHdr.bfReserved2 = 0 ;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize ;
HANDLE hFile = CreateFile (FilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;//创建位图文件
DWORD dwWritten ;
WriteFile (hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL) ; // 写入位图文件头
WriteFile (hFile, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL) ;// 写入位图文件其余内容
GlobalUnlock (hDib) ; //清理
GlobalFree (hDib) ;
CloseHandle (hFile) ;
SetWindowText (gMF_hWnd, FileTitle) ; // 更改窗体标题
return TRUE ;
}
|
|