备份一份代码,用于窗口截图~!
使用的时候只需要调用Catchfile函数就可以了。
当然,代码中的WIDTH、MARGIN、 HEIGHT等还得按需要进行设定。
- void CMyDialog::Catchfile()
- {
- HBITMAP hBitmap = GetSrcBit();
- if (hBitmap != NULL)
- {
- // szFilters is a text string that includes two file name filter:
- // "*.bmp" for "bmp Files" and "*.*" for "All Files."
- char szFilters[]=
- "bmp Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
- // Create a Save dialog; the default file name extension is ".bmp".
- CFileDialog fileDlg (FALSE, "bmp", "*.bmp",
- OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
- // Display the file dialog. When user clicks OK, fileDlg.DoModal()
- // returns IDOK.
- if( fileDlg.DoModal() == IDOK )
- {
- CString pathName = fileDlg.GetPathName();
- // Implement opening and reading file in here.
- //...
- //Change the window's title to the opened file's title.
- //CString fileName = fileDlg.GetFileTitle ();
- //SetWindowText(fileName);
- SaveBitmapToFile(hBitmap , pathName.GetBuffer()/*LPSTR lpFileName*/);
- }
- }
- }
- void CMyDialog::GetSrcBit(/*DWORD BitWidth, DWORD BitHeight*/void)
- {
- HBITMAP hBitmap,hOldBitmap;
- CPaintDC dc(this);
- HDC hmyMemDC = CreateCompatibleDC(dc.m_hDC);
- hBitmap = CreateCompatibleBitmap(dc.m_hDC, WIDTH-MARGIN, HEIGHT);
- hOldBitmap = (HBITMAP)SelectObject(hmyMemDC, hBitmap);
- BitBlt(hmyMemDC, 0, 0, WIDTH, HEIGHT,dc.m_hDC, 0, 0, SRCCOPY);
- hBitmap = (HBITMAP)SelectObject(hmyMemDC, hOldBitmap);
- return (hBitmap);
- }
- // 我们也可以把屏幕内容以位图格式存到磁盘文件上.
- // lpFileName 为位图文件脕E
- int CMyDialog::SaveBitmapToFile(HBITMAP hBitmap , LPSTR lpFileName)
- {
- HDC hDC; //设备描述句柄
- int iBits; //当前显示分辨率下每个像素所占字节数
- WORD wBitCount; //位图中每个像素所占字节数
- //定义调色板大小, 位图中像素字节大小 ,
- //位图文件大小
- DWORD dwPaletteSize=0,
- dwBmBitsSize,
- dwDIBSize, dwWritten;
- BITMAP Bitmap; //位图属性结构
- BITMAPFILEHEADER bmfHdr; //位图文件头结构
- //位图信息头结构
- BITMAPINFOHEADER bi;
- //指向位图信息头结构
- LPBITMAPINFOHEADER lpbi;
- //定义文件,分配内存句柄,调色板句眮E
- HANDLE fh, hDib;
- HPALETTE hPal,hOldPal=NULL;
- //计算位图文件每个像素所占字节数
- hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
- iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
- DeleteDC(hDC);
- if (iBits <= 1)
- wBitCount = 1;
- else if (iBits <= 4)
- wBitCount = 4;
- else if (iBits <= 8)
- wBitCount = 8;
- else if (iBits <= 24)
- wBitCount = 24;
- else wBitCount = 24;
- //计算调色板大小
- if (wBitCount <= 8)
- dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
- //设置位图信息头结构
- GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
- bi.biSize = sizeof(BITMAPINFOHEADER);
- bi.biWidth = Bitmap.bmWidth;
- bi.biHeight = Bitmap.bmHeight;
- bi.biPlanes = 1;
- bi.biBitCount = wBitCount;
- bi.biCompression = BI_RGB;
- bi.biSizeImage = 0;
- bi.biXPelsPerMeter = 0;
- bi.biYPelsPerMeter = 0;
- bi.biClrUsed = 0;
- bi.biClrImportant = 0;
- dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;
- //为位图内容分配内磥E
- hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
- lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
- *lpbi = bi;
- hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
- if (hPal)
- {
- hDC = ::GetDC(NULL);
- hOldPal = SelectPalette(hDC, hPal, FALSE);
- RealizePalette(hDC);
- }
- // 获取该调色板下新的像素值
- GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
- //恢复调色皝E
- if (hOldPal)
- {
- SelectPalette(hDC, hOldPal, TRUE);
- RealizePalette(hDC);
- ::ReleaseDC(NULL, hDC);
- }
- //创建位图文件
- fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if (fh == INVALID_HANDLE_VALUE)
- return FALSE;
- //设置位图文件头
- bmfHdr.bfType = 0x4D42; // "BM"
- dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
- + dwPaletteSize + dwBmBitsSize;
- bmfHdr.bfSize = dwDIBSize;
- bmfHdr.bfReserved1 = 0;
- bmfHdr.bfReserved2 = 0;
- bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
- + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
- WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
- WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
- //清除
- GlobalUnlock(hDib);
- GlobalFree(hDib);
- CloseHandle(fh);
- return TRUE;
- }