您的位置:首页 > 其它

实现WIN CE下截屏并且保存到文件

2016-05-20 16:37 411 查看
  本文为转载,原文地址丢失,sorry


##################################################################################################################

  找了一些WinCE下的截图软件,但大都是ARM平台下的,可怜俺用的是Intel,还是自己写吧。

    找了一篇WinCE下的截屏代码,真的不错,真的像原作者说的,不用修改。


———————————————————————————————————————————————————————————————————————————

// this function create a bmp file to save the current screen;

// supported eVC++ 4.0 (wince 4.0) and vc++ 6.0 , test pass; 

void CSnapDlg::OnScreenSave(const char *filename)



    HDC  hScrDC, hMemDC;         

    int  width, height; 
 
 //the pointer will save all pixel point's color value

 BYTE  *lpBitmapBits = NULL; 

        

 //creates a device context for the screen device

    hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);

  //get the screen point size
    width = GetDeviceCaps(hScrDC, HORZRES);

    height = GetDeviceCaps(hScrDC, VERTRES);

    //creates a memory device context (DC) compatible with the screen device(hScrDC)  

    hMemDC = CreateCompatibleDC(hScrDC);

 //initialise the struct BITMAPINFO for the bimap infomation, 
 //in order to use the function CreateDIBSection

 // 
on wince os, each pixel stored by 24 bits(biBitCount=24) 

 //and no compressing(biCompression=0) 


    BITMAPINFO RGB24BitsBITMAPINFO; 
    ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));

    RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

    RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;

    RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;

    RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;

    RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;

   

  //use the function CreateDIBSection and SelectObject 

 //in order to get the bimap pointer : lpBitmapBits 


    HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO, 

       DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);

 HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);

 // copy the screen dc to the memory dc

 BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);

 
 //if you only want to get the every pixel color value, 

 //you can begin here and the following part of this function will be unuseful;

 //the following part is in order to write file;


 //bimap file header in order to write bmp file 

 BITMAPFILEHEADER bmBITMAPFILEHEADER;

 ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));

 bmBITMAPFILEHEADER.bfType = 0x4d42;  //bmp  

    bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)

 
 //write into file

 FILE *mStream = NULL;

 if((mStream = fopen(filename, "wb")))

 {  

  //write bitmap file header

  fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);

  //write bitmap info

  fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);

  //write bitmap pixels data

  fwrite(lpBitmapBits, 3*width*height, 1, mStream);

   //close file
  fclose(mStream);

 }

 
 //delete

 DeleteObject(hMemDC);

 DeleteObject(hScrDC);

 DeleteObject(directBmp);

 DeleteObject(previousObject);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: