不知是什么原因,我从放假以来我的可用分一直未加(为0),各位我以后有的时候加,谢谢了,先!
我的程序实现功能是截取屏幕并把他存为BITMAP文件,但我用画图程序却打不开,不知是哪儿错了,各位帮忙看一下,谢谢!
int CScreen_testView::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
HDC hDC;  
//设备描述表 
int iBits;  
//当前显示分辨率下每个像素所占字节数 
WORD wBitCount;  
//位图中每个像素所占字节数 
//定义调色板大小, 位图中像素字节大小 , 
//位图文件大小 , 写入文件字节数 
DWORD dwPaletteSize=0, 
dwBmBitsSize, 
dwDIBSize, dwWritten; 
BITMAP Bitmap;  
//位图属性结构 
BITMAPFILEHEADER bmfHdr;  
//位图文件头结构 
BITMAPINFOHEADER bi;  //位图信息头结构  
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 
HANDLE fh, hDib, hPal,hOldPal=NULL; 
//定义文件,分配内存句柄,调色板句柄 
 
//计算位图文件每个像素所占字节数 
hDC = CreateDC("DISPLAY",NULL,NULL,NULL); 
iBits = GetDeviceCaps(hDC, BITSPIXEL) *  
GetDeviceCaps(hDC, PLANES); 
DeleteDC(hDC); 
if (iBits <= 1) 
wBitCount = 1; 
else if (iBits <= 4) 
wBitCount = 4; 
else if (iBits <= 8) 
wBitCount = 8; 
else if (iBits <= 24) 
wBitCount = 24; 
//计算调色板大小 
if (wBitCount <= 8) 
dwPaletteSize = (1 <<wBitCount) * 
sizeof(RGBQUAD); 
 
//设置位图信息头结构 
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); 
bi.biSize = sizeof(BITMAPINFOHEADER); 
bi.biWidth = Bitmap.bmWidth; 
bi.biHeight = Bitmap.bmHeight; 
bi.biPlanes = 1; 
bi.biBitCount = wBitCount; 
bi.biCompression = BI_RGB; 
bi.biSizeImage = 0; 
bi.biXPelsPerMeter = 0; 
bi.biYPelsPerMeter = 0; 
bi.biClrUsed = 0; 
bi.biClrImportant = 0; 
 
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight ; 
//为位图内容分配内存 
hDib = GlobalAlloc(GMEM_FIXED, dwPaletteSize+sizeof(BITMAPINFOHEADER)); 
if(!hDib)
AfxMessageBox("ERROR");
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi =bi; 
// 处理调色板  
hPal = GetStockObject(DEFAULT_PALETTE); 
if (hPal) 

hDC = ::GetDC(NULL); 
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
RealizePalette(hDC); 

// 获取该调色板下新的像素值 
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, 
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS); 
//恢复调色板  
if (hOldPal) 

SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
RealizePalette(hDC); 
//ReleaseDC ((HWND)NULL,hDc); 

//创建位图文件  
fh = CreateFile(lpFileName, GENERIC_WRITE,  
0, NULL, CREATE_ALWAYS, 
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
if (fh == INVALID_HANDLE_VALUE) 
return FALSE; 
// 设置位图文件头 
bmfHdr.bfType = 0x4D42; // "BM" 
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; 
// 写入位图文件头 
WriteFile(fh, (LPSTR)&bmfHdr, sizeof 
(BITMAPFILEHEADER), &dwWritten, NULL); 
// 写入位图文件其余内容 
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,  
&dwWritten, NULL); 
//清除  
GlobalUnlock(hDib); 
GlobalFree(hDib); 
CloseHandle(fh); }