#define PW_WINDOW 9001 #define PW_CLIENT 9002 HBITMAP CMyProgramDlg::CopyScreenToBitmap(LPRECT lpRect) { HDC hScrDC, hMemDC; // screen DC and memory DC int nX, nY, nX2, nY2; // coordinates of rectangle to grab int nWidth, nHeight; // DIB width and height int xScrn, yScrn; // screen resolution HGDIOBJ hOldBitmap , hBitmap; // 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)hBitmap; } HBITMAP CYourProgramDlg::CopyWindowToBitmap(CWnd* wnd , HWND hWnd, WORD fPrintArea) { HBITMAP hBitmap = NULL; // handle to device-dependent bitmap // check for a valid window handle if (!hWnd) return NULL; RECT rectWnd; ::GetWindowRect(hWnd, &rectWnd); switch (fPrintArea) { case PW_WINDOW: // copy entire window { // get the window rectangle // get the bitmap of that window by calling // CopyScreenToBitmap and passing it the window rect // GetWindowRect(&rectWnd); hBitmap = CopyScreenToBitmap(&rectWnd); break; } case PW_CLIENT: // copy client area { RECT rectClient; POINT pt1, pt2; // get client dimensions wnd->GetClientRect(&rectClient); // convert client coords to screen coords pt1.x = rectClient.left; pt1.y = rectClient.top; pt2.x = rectClient.right; pt2.y = rectClient.bottom; wnd->ClientToScreen(&pt1); wnd->ClientToScreen(&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; }
http://forums.codeguru.com/showthread.php?244907-Screen-Capture
时间: 2024-10-03 10:56:43