/* * copy.c * * Source file for Device-Independent Bitmap (DIB) API. Provides * the following functions: * * CopyWindowToDIB() - Copies a window to a DIB * CopyScreenToDIB() - Copies entire screen to a DIB * CopyWindowToBitmap()- Copies a window to a standard Bitmap * CopyScreenToBitmap()- Copies entire screen to a standard Bitmap * * The following functions are called from DIBUTIL.C: * * DIBToBitmap() - Creates a bitmap from a DIB * BitmapToDIB() - Creates a DIB from a bitmap * DIBWidth() - Gets the width of the DIB * DIBHeight() - Gets the height of the DIB * CreateDIBPalette() - Gets the DIB's palette * GetSystemPalette() - Gets the current palette * * Development Team: Mark Bader * Patrick Schreiber * Garrett McAuliffe * Eric Flo * Tony Claflin * * Written by Microsoft Product Support Services, Developer Support. * Copyright (c) 1991 Microsoft Corporation. All rights reserved. */ /* header files */ #include #include "ERRORS.H" #include "DIBUTIL.H" #include "DIBAPI.H" /************************************************************************* * * CopyWindowToDIB() * * Parameters: * * HWND hWnd - specifies the window * * WORD fPrintArea - specifies the window area to copy into the device- * independent bitmap * * Return Value: * * HDIB - identifies the device-independent bitmap * * Description: * * This function copies the specified part(s) of the window to a device- * independent bitmap. * ************************************************************************/ HDIB CopyWindowToDIB(HWND hWnd, WORD fPrintArea) { HDIB hDIB = NULL; // handle to DIB /* check for a valid window handle */ if (!hWnd) return NULL; switch (fPrintArea) { case PW_WINDOW: // copy entire window { RECT rectWnd; /* get the window rectangle */ GetWindowRect(hWnd, &rectWnd); /* get the DIB of the window by calling * CopyScreenToDIB and passing it the window rect */ hDIB = CopyScreenToDIB(&rectWnd); } break; case PW_CLIENT: // copy client area { RECT rectClient; POINT pt1, pt2; /* get the client area dimensions */ GetClientRect(hWnd, &rectClient); /* convert client coords to screen coords */ pt1.x = rectClient.left; pt1.y = rectClient.top; pt2.x = rectClient.right; pt2.y = rectClient.bottom; ClientToScreen(hWnd, &pt1); ClientToScreen(hWnd, &pt2); rectClient.left = pt1.x; rectClient.top = pt1.y; rectClient.right = pt2.x; rectClient.bottom = pt2.y; /* get the DIB of the client area by calling * CopyScreenToDIB and passing it the client rect */ hDIB = CopyScreenToDIB(&rectClient); } break; default: // invalid print area return NULL; } /* return the handle to the DIB */ return hDIB; } /************************************************************************* * * CopyScreenToDIB() * * Parameter: * * LPRECT lpRect - specifies the window * * Return Value: * * HDIB - identifies the device-independent bitmap * * Description: * * This function copies the specified part of the screen to a device- * independent bitmap. * ************************************************************************/ HDIB CopyScreenToDIB(LPRECT lpRect) { HBITMAP hBitmap; // handle to device-dependent bitmap HPALETTE hPalette; // handle to palette HDIB hDIB = NULL; // handle to DIB /* get the device-dependent bitmap in lpRect by calling * CopyScreenToBitmap and passing it the rectangle to grab */ hBitmap = CopyScreenToBitmap(lpRect); /* check for a valid bitmap handle */ if (!hBitmap) return NULL; /* get the current palette */ hPalette = GetSystemPalette(); /* convert the bitmap to a DIB */ hDIB = BitmapToDIB(hBitmap, hPalette); /* clean up */ DeleteObject(hBitmap); /* return handle to the packed-DIB */ return hDIB; } /************************************************************************* * * CopyWindowToBitmap() * * Parameters: * * HWND hWnd - specifies the window * * WORD fPrintArea - specifies the window area to copy into the device- * dependent bitmap * * Return Value: * * HDIB - identifies the device-dependent bitmap * * Description: * * This function copies the specified part(s) of the window to a device- * dependent bitmap. * ************************************************************************/ HBITMAP CopyWindowToBitmap(HWND hWnd, WORD fPrintArea) { HBITMAP hBitmap = NULL; // handle to device-dependent bitmap /* check for a valid window handle */ if (!hWnd) return NULL; switch (fPrintArea) { case PW_WINDOW: // copy entire window { RECT rectWnd; /* get the window rectangle */ GetWindowRect(hWnd, &rectWnd); /* get the bitmap of that window by calling * CopyScreenToBitmap and passing it the window rect */ hBitmap = CopyScreenToBitmap(&rectWnd); } break; case PW_CLIENT: // copy client area { RECT rectClient; POINT pt1, pt2; /* get client dimensions */ GetClientRect(hWnd, &rectClient); /* convert client coords to screen coords */ pt1.x = rectClient.left; pt1.y = rectClient.top; pt2.x = rectClient.right; pt2.y = rectClient.bottom; ClientToScreen(hWnd, &pt1); ClientToScreen(hWnd, &pt2); rectClient.left = pt1.x; rectClient.top = pt1.y; rectClient.right = pt2.x; rectClient.bottom = pt2.y; /* get the bitmap of the client area by calling * CopyScreenToBitmap and passing it the client rect */ hBitmap = CopyScreenToBitmap(&rectClient); } break; default: // invalid print area return NULL; } /* return handle to the bitmap */ return hBitmap; } /************************************************************************* * * CopyScreenToBitmap() * * Parameter: * * LPRECT lpRect - specifies the window * * Return Value: * * HDIB - identifies the device-dependent bitmap * * Description: * * This function copies the specified part of the screen to a device- * dependent bitmap. * ************************************************************************/ HBITMAP CopyScreenToBitmap(LPRECT lpRect) { HDC hScrDC, hMemDC; // screen DC and memory DC HBITMAP hBitmap, hOldBitmap; // handles to deice-dependent bitmaps int nX, nY, nX2, nY2; // coordinates of rectangle to grab int nWidth, nHeight; // DIB width and height int xScrn, yScrn; // screen resolution /* check for an empty rectangle */ if (IsRectEmpty(lpRect)) return NULL; /* create a DC for the screen and create * a memory DC compatible to screen DC */ hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hScrDC); /* get points of rectangle to grab */ nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; /* get screen resolution */ xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); /* make sure bitmap rectangle is visible */ if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > xScrn) nX2 = xScrn; if (nY2 > yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; /* create a bitmap compatible with the screen DC */ hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); /* select new bitmap into memory DC */ hOldBitmap = SelectObject(hMemDC, hBitmap); /* bitblt screen DC to memory DC */ BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); /* select old bitmap back into memory DC and get handle to * bitmap of the screen */ hBitmap = SelectObject(hMemDC, hOldBitmap); /* clean up */ DeleteDC(hScrDC); DeleteDC(hMemDC); /* return handle to the bitmap */ return hBitmap; }