HBITMAP CreateDIBSection( HDC hdc, // handle to DC CONST
BITMAPINFO*pbmi, // bitmap data
UINT iUsage, // data type indicator
VOID**ppvBits,          // bit values
HANDLE hSection,         // handle to file mapping object
DWORD dwOffset           // offset to bitmap bit values); 
CreateDIBSection函数会根据位图结构信息(pbmi)分配内存空间,你不用为它分配内存,这块内存也不需要你释放,系统会自己释放的。然后将位图中的图像数据读入这个内存地址,显示即可。
LPBYTE   lpBits;
HBITMAP   hBmp=::CreateDIBSection(dcMem.m_hDC,lpBitmap,DIB_PAL_COLORS,   &lpBits,NULL,0);
//将图像数据填充到得到的内存地址中
  file.ReadHuge(lpBits,dwBitlen);   
  pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMem,0,0,   
  bmp.bmWidth,bmp.bmHeight,SRCCOPY);  
首先让我们检查一下如何简化CreateDIBSection,并正确地使用它。首先,把最後两个参数hSection和dwOffset,分别设定为NULL和0,我将在本章最後讨论这些参数的用法。第二,仅在fColorUse参数设定为DIB_ PAL_COLORS时,才使用hdc参数,如果fColorUse为DIB_RGB_COLORS(或0),hdc将被忽略(这与CreateDIBitmap不同,hdc参数用於取得与DDB相容的设备的色彩格式,CreateDIBitmap创建的是DDB(设备相关位图,CreateDIBSection创建设备无关位图),因此必须指定与位图所关联的设备,即hdc,位图根据hdc所代表的设备来取得位图的色彩格式)。
因此,CreateDIBSection最简单的形式仅需要第二和第四个参数。第二个参数是指向BITMAPINFO结构的指标,
BITMAPINFOHEADER         bmih ;
BYTE                           * pBits ;
HBITMAP                          hBitmap ;
现在初始化BITMAPINFOHEADER结构的栏位

bmih->biSize                  = sizeof (BITMAPINFOHEADER) ;
bmih->biWidth                 = 384 ;
bmih->biHeight                = 256 ;
bmih->biPlanes                = 1 ;
bmih->biBitCount              = 24 ;
bmih->biCompression           = BI_RGB ;
bmih->biSizeImage             = 0 ;
bmih->biXPelsPerMeter         = 0 ;
bmih->biYPelsPerMeter         = 0 ;
bmih->biClrUsed               = 0 ;
bmih->biClrImportant          = 0 ;
在基本准备後,我们呼叫该函式:
hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)  &bmih, 0, &pBits, NULL, 0) ;
这是函式呼叫所做的:CreateDIBSection检查BITMAPINFOHEADER结构并配置足够的记忆体块来载入DIB图素位元。(在这个例子里,记忆体块的大小为384×256×3位元组。)它在您提供的pBits参数中储存了指向此记忆体块的指标。
然而,我们还没有做完,点阵图图素是未初始化的。如果正在读取DIB档案,可以简单地把pBits参数传递给ReadFile函式并读取它们。或者可以使用一些程式码「人工」设定。
注意:使用CreateDIBSection函数获得的内存块指针(输出的第四个参数)所指向的地址中是没有内容的,我们必须向里面写入图像数据,然后才能够显示图像。 
 

   int SaveJPEGToFile(HBITMAP hBitmap,LPCSTR lpFileName)//将截屏所得保存为jpeg图片 
  
{ 
  
    HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 
  
    HDC hOffDC=CreateCompatibleDC(hDC); 
  
    SelectObject(hOffDC,hBitmap); 
  
     
  
    BITMAP Bitmap; 
  
    GetObject(hBitmap,sizeof(BITMAP),&Bitmap); 
  
     
  
    HANDLE fh=CreateFile((LPCWSTR)lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, 
  
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); 
  
    if(fh == INVALID_HANDLE_VALUE ) 
  
        return FALSE; 
  
    BITMAPFILEHEADER bfh; 
  
    memset(&bfh,0,sizeof(bfh)); 
  
    bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; 
  
    bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER); 
  
    bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); 
  
    DWORD dwWritten=0; 
  
//    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); 
  
    BITMAPINFOHEADER bih; 
  
    memset(&bih,0,sizeof(bih)); 
  
    bih.biSize=sizeof(bih); 
  
    bih.biWidth=Bitmap.bmWidth; 
  
    bih.biHeight=Bitmap.bmHeight; 
  
    bih.biPlanes=1; 
  
    bih.biBitCount=24; 
  

    /*if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) 
  
    { 
  
        return FALSE; 
  
    }*/ 
  
     
  
    BITMAPINFO bitmapInfo; 
  
    memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); 
  
    bitmapInfo.bmiHeader=bih; 
  

    HDC hMemDC=CreateCompatibleDC(hDC);     
  
    BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)]; 
  
    HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp, 
  
        NULL,0); 
  
    if(hDibBitmap != 0) 
  
    { 
  
        ::SelectObject(hMemDC,hDibBitmap); 
  
        BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); 
  
        //WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL); 
  
         WriteJPEGFile(lpFileName, m_lpBitBmp,Bitmap.bmWidth,Bitmap.bmHeight,TRUE, 60); 
  

    } 
  
     
  
    DeleteObject(hDibBitmap); 
  
    DeleteDC(hDC); 
  
    DeleteDC(hMemDC); 
  

    CloseHandle(fh); 
  
    return 1; 
  
} 
  
 
捕捉屏幕
 
 

   HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight) 
  
{ 
  
    // 屏幕和内存设备描述表 
  
    HDC  hScrDC, hMemDC;       
  
    // 位图句柄 
  
    HBITMAP  hBitmap, hOldBitmap;     
  
    // 屏幕分辨率 
  
    int  xScrn, yScrn;         
  
     
  
    //为屏幕创建设备描述表 
  
    hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); 
  
    //为屏幕设备描述表创建兼容的内存设备描述表 
  
    hMemDC = CreateCompatibleDC(hScrDC); 
  
    // 获得屏幕分辨率 
  
    xScrn = GetDeviceCaps(hScrDC, HORZRES); 
  
    yScrn = GetDeviceCaps(hScrDC, VERTRES); 
  

    //存储屏幕的长宽 
  
    nWidth = xScrn; 
  
    nHeight = yScrn; 
  
     
  
    // 创建一个与屏幕设备描述表兼容的位图 
  
    hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn); 
  
    // 把新位图选到内存设备描述表中 
  
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
  
    // 把屏幕设备描述表拷贝到内存设备描述表中 
  
    BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY); 
  
    //得到屏幕位图的句柄 
  
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); 
  
    //清除 
  
    DeleteDC(hScrDC); 
  
    DeleteDC(hMemDC); 
  
    // 返回位图句柄 
  
    return hBitmap; 
  
}