j截图Code

 

void CjietuDlg::copyScreen(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(TEXT("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);

}

 

void CjietuDlg::OnBnClickedOk()

{

    // TODO: Add your control notification handler code here

    static int iN=0;

    CString str("");

 

    str.Format(L"%d.bmp",iN);

    char   charTest[512];

    WideCharToMultiByte(CP_ACP,0,str,-1,charTest,512,NULL,NULL);

    copyScreen(charTest);

    iN++;

 

    //OnOK();

}

原文地址:https://www.cnblogs.com/wqj1212/p/2340861.html