📄 subject_16520.htm
字号:
<p>
序号:16520 发表者:elf 发表日期:2002-09-29 10:42:32
<br>主题:关于屏幕抓图的问题,急!
<br>内容:如何在子文档区中,使用鼠标选择一定的区域,然后将区域中的信息存为CBitmap对象。<BR><BR>各位高手请多指教。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:iwill 回复日期:2002-09-29 10:51:54
<br>内容:给一段考屏的代码,自己修改一下吧<BR><BR>CString dt;<BR> CTime m_CurDT;<BR> m_CurDT=CTime::GetCurrentTime();<BR> dt.Format("%d-%d-%d ",m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay());<BR> dt+=m_CurDT.Format("%H时%M分%S秒");<BR> dt+=".bmp";<BR> CString bmpname;<BR> bmpname="c:\\"; <BR> bmpname+=dt; <BR><BR> HDC hScrDC, hMemDC; <BR> // 屏幕和内存设备描述表<BR> int nX, nY, nX2, nY2; <BR> // 位图宽度和高度<BR> int xScrn, yScrn; <BR> // 屏幕分辨率<BR> HBITMAP hBitmap, hOldBitmap; <BR><BR> //为屏幕创建设备描述表<BR> hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);<BR> //为屏幕设备描述表创建兼容的内存设备描述表<BR> hMemDC = CreateCompatibleDC(hScrDC);<BR> // 获得屏幕分辨率<BR> xScrn = GetDeviceCaps(hScrDC, HORZRES);<BR> yScrn = GetDeviceCaps(hScrDC, VERTRES);<BR> // 获得全屏坐标<BR> nX = 0;<BR> nY = 0;<BR> nX2 = xScrn;<BR> nY2 = yScrn;<BR> <BR> // 创建一个与屏幕设备描述表兼容的位图<BR> hBitmap = CreateCompatibleBitmap(hScrDC, nX2, nY2);<BR> // 把新位图选到内存设备描述表中<BR> hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);<BR> // 把屏幕设备描述表拷贝到内存设备描述表中<BR> BitBlt(hMemDC, 0, 0, nX2, nY2, hScrDC, nX, nY, SRCCOPY);<BR> //得到屏幕位图的句柄<BR> hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);<BR> //清除 <BR> DeleteDC(hScrDC);<BR> DeleteDC(hMemDC);<BR><BR> HDC hDC; <BR> int iBits; <BR> //当前显示分辨率下每个像素所占字节数<BR> WORD wBitCount; <BR> //位图中每个像素所占字节数<BR> //定义调色板大小, 位图中像素字节大小 ,<BR> DWORD dwPaletteSize=0,<BR> dwBmBitsSize,<BR> dwDIBSize, dwWritten;<BR> BITMAP Bitmap; <BR> //位图属性结构<BR> BITMAPFILEHEADER bmfHdr; <BR> //位图文件头结构<BR> BITMAPINFOHEADER bi; <BR> //位图信息头结构 <BR> LPBITMAPINFOHEADER lpbi; <BR> //指向位图信息头结构<BR> HANDLE fh, hDib, hPal,hOldPal=NULL;<BR> //定义文件,分配内存句柄,调色板句柄<BR> <BR> //计算位图文件每个像素所占字节数<BR> hDC = CreateDC("DISPLAY",NULL,NULL,NULL);<BR> iBits = GetDeviceCaps(hDC, BITSPIXEL) * <BR> GetDeviceCaps(hDC, PLANES);<BR> DeleteDC(hDC);<BR> if (iBits <= 1)<BR> wBitCount = 1;<BR> else if (iBits <= 4)<BR> wBitCount = 4;<BR> else if (iBits <= 8)<BR> wBitCount = 8;<BR> else if (iBits <= 24)<BR> wBitCount = 24;<BR> else<BR> wBitCount = iBits;<BR> //计算调色板大小<BR> if (wBitCount <= 8)<BR> dwPaletteSize = (1 << wBitCount) *<BR> sizeof(RGBQUAD);<BR> <BR> //设置位图信息头结构<BR> GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);<BR> bi.biSize = sizeof(BITMAPINFOHEADER);<BR> bi.biWidth = Bitmap.bmWidth;<BR> bi.biHeight = Bitmap.bmHeight;<BR> bi.biPlanes = 1;<BR> bi.biBitCount = wBitCount;<BR> bi.biCompression = BI_RGB;<BR> bi.biSizeImage = 0;<BR> bi.biXPelsPerMeter = 0;<BR> bi.biYPelsPerMeter = 0;<BR> bi.biClrUsed = 0;<BR> bi.biClrImportant = 0;<BR><BR> dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight;<BR> //为位图内容分配内存<BR> hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));<BR> lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);<BR> *lpbi = bi;<BR><BR> // 处理调色板 <BR> hPal = GetStockObject(DEFAULT_PALETTE);<BR> if (hPal)<BR> {<BR> hDC = ::GetDC(NULL);<BR> hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);<BR> RealizePalette(hDC);<BR> }<BR> // 获取该调色板下新的像素值<BR> GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);<BR> //恢复调色板 <BR> if (hOldPal)<BR> {<BR> SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);<BR> RealizePalette(hDC);<BR> ::ReleaseDC(NULL, hDC);<BR> }<BR><BR> //创建位图文件 <BR> fh = CreateFile(bmpname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);<BR> // 设置位图文件头<BR> bmfHdr.bfType = 0x4D42; // "BM"<BR> dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; <BR> bmfHdr.bfSize = dwDIBSize;<BR> bmfHdr.bfReserved1 = 0;<BR> bmfHdr.bfReserved2 = 0;<BR> bmfHdr.bfOffBits = (DWORD)sizeof<BR> (BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;<BR> // 写入位图文件头<BR> WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);<BR> // 写入位图文件其余内容<BR> WriteFile(fh, (LPSTR)lpbi, dwDIBSize, <BR> &dwWritten, NULL);<BR> //清除 <BR> GlobalUnlock(hDib);<BR> GlobalFree(hDib);<BR> CloseHandle(fh);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:TopLevel 回复日期:2002-09-29 11:21:36
<br>内容:传入指定的坐标值既可。把屏幕DC换成View DC即可。<BR>http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=378<BR><BR>2002-9-29 11:27:27
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -