前几天我发贴问了这样一个问题:如何将我自己在屏幕上画的一副图保存起来?就好象画板一样画个矩形,保存成bmp格式然后还能将之打开,对屏幕上自己画的东西如何填充位图 的结构以进行存储。然后有位同学帮我说了一下:BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
int iBits;
WORD wBitCount;
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
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   wBitCount = 24; 

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.biClrImportant = 0;
bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
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, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 

if (hOldPal) 

::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
RealizePalette(hDC); 
::ReleaseDC(NULL, hDC); 


fh = CreateFile(FileName, 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); 

return TRUE;

}我的问题就是:
这个函数中的参数hBitmap.在调用这个函数的时候是不是在caller中定义以下就行了,用不用初始化,比如,建立一个CreateBimap之类的,如果需要的话,那末是用CreateDIBSection 还是用 CreateDIBitmap,并且要用到一些(bitmapinfo *)之类的参数了吗,我感觉是个循环似的 。
有没有谁能给我把这个讲一下,包括调用这个函数caller的设置。

解决方案 »

  1.   

    HDC hDC = ::GetDC(0);
    void* pBits;
    HBITMAP hBmp = CreateDIBSection(hDC, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS, &pBits, NULL, 0);
    SetDIBits(hDC, hBmp, 0, h, bufDest, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS);....
      

  2.   

    hBitmap是你内存中已经存在了的位图数据块,它可以是
    HBITMAP hBitmap= CreateDIBSection(hDC, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS, &pBits, NULL, 0);建立的,
    也可能是这样来的:HBITMAP hBitmap=::LoadImage(...);
    或者HBITMAP hBitmap=m_Bitmap.LoadBitmap(IDB_BITMAP1)等等,总之,hBitmap应该是已经分配并已经载入了位图相关数据信息的内存块!
      

  3.   

    那我现在问一下如果我想把我现在在屏幕上自己画的一个矩形或者什么的保存起来如何建立这个hBitmap这个句柄呢?或者说如何建立这个位图数据块呢?在想等候!焦急等候,谢谢