To copy an image from a display screen to a bit map:
The following figure demonstrates these steps.
HDC hdcMem;
PSZ pszData[4] = { "Display", NULL, NULL, NULL };
HPS hpsMem, hps;
HAB hab;
SIZEL sizlPage = {0, 0};
BITMAPINFOHEADER2 bmp;
PBITMAPINFO2 pbmi;
HBITMAP hbm;
SHORT sWidth = 128, sHeight = 128;
POINTL aptl[3];
LONG alData[2];
/*
* Create the memory device context and presentation space so they
* are compatible with the screen device context and presentation space.
*/
hdcMem = DevOpenDC(hab, OD_MEMORY, "*", 4,
(PDEVOPENDATA) pszData, NULLHANDLE);
hpsMem = GpiCreatePS(hab, hdcMem, &sizlPage,
PU_PELS | GPIA_ASSOC | GPIT_MICRO);
/* Determine the device's plane/bit-count format. */
GpiQueryDeviceBitmapFormats(hpsMem, 2, alData);
/*
* Load the BITMAPINFOHEADER2 and BITMAPINFO2 structures. The sWidth and
* sHeight fields specify the width and height of the destination
* rectangle.
*/
bmp.cbFix = (ULONG) sizeof(BITMAPINFOHEADER2);
bmp.cx = sWidth;
bmp.cy = sHeight;
bmp.cPlanes = alData[0];
bmp.cBitCount = alData[1];
bmp.ulCompression = BCA_UNCOMP;
bmp.cbImage = (((sWidth *
(1 << bmp.cPlanes) * (1 << bmp.cBitCount)) + 31) / 32) * sHeight;
bmp.cxResolution = 70;
bmp.cyResolution = 70;
bmp.cclrUsed = 2;
bmp.cclrImportant = 0;
bmp.usUnits = BRU_METRIC;
bmp.usReserved = 0;
bmp.usRecording = BRA_BOTTOMUP;
bmp.usRendering = BRH_NOTHALFTONED;
bmp.cSize1 = 0;
bmp.cSize2 = 0;
bmp.ulColorEncoding = BCE_RGB;
bmp.ulIdentifier = 0;
DosAllocMem((PPVOID)&pbmi, sizeof(BITMAPINFO2) +
(sizeof(RGB2) * (1 << bmp.cPlanes) * (1 << bmp.cBitCount)),
PAG_COMMIT | PAG_READ | PAG_WRITE);
pbmi->cbFix = bmp.cbFix;
pbmi->cx = bmp.cx;
pbmi->cy = bmp.cy;
pbmi->cPlanes = bmp.cPlanes;
pbmi->cBitCount = bmp.cBitCount;
pbmi->ulCompression = BCA_UNCOMP;
pbmi->cbImage = ((sWidth+31)/32) * sHeight;
pbmi->cxResolution = 70;
pbmi->cyResolution = 70;
pbmi->cclrUsed = 2;
pbmi->cclrImportant = 0;
pbmi->usUnits = BRU_METRIC;
pbmi->usReserved = 0;
pbmi->usRecording = BRA_BOTTOMUP;
pbmi->usRendering = BRH_NOTHALFTONED;
pbmi->cSize1 = 0;
pbmi->cSize2 = 0;
pbmi->ulColorEncoding = BCE_RGB;
pbmi->ulIdentifier = 0;
/* Create a bit map that is compatible with the display. */
hbm = GpiCreateBitmap(hpsMem, &bmp, FALSE, NULL, pbmi);
/* Associate the bit map and the memory presentation space. */
GpiSetBitmap(hpsMem, hbm);
/* Copy the screen to the bit map. */
aptl[0].x = 0; /* Lower-left corner of destination rectangle */
aptl[0].y = 0; /* Lower-left corner of destination rectangle */
aptl[1].x = sWidth; /* Upper-right corner of destination rectangle */
aptl[1].y = sHeight; /* Upper-right corner of destination rectangle */
aptl[2].x = 0; /* Lower-left corner of source rectangle */
aptl[2].y = 0; /* Lower-left corner of source rectangle */
hps = WinGetScreenPS(HWND_DESKTOP);
GpiBitBlt(hpsMem, hps,
sizeof(aptl) / sizeof(POINTL), /* Number of points in aptl */
aptl, ROP_SRCCOPY, BBO_IGNORE);
WinReleasePS(hps);