⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_16520.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;&nbsp;&nbsp;CTime m_CurDT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_CurDT=CTime::GetCurrentTime();<BR>&nbsp;&nbsp;&nbsp;&nbsp;dt.Format("%d-%d-%d ",m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay());<BR>&nbsp;&nbsp;&nbsp;&nbsp;dt+=m_CurDT.Format("%H时%M分%S秒");<BR>&nbsp;&nbsp;&nbsp;&nbsp;dt+=".bmp";<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString bmpname;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bmpname="c:\\";&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bmpname+=dt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hScrDC, hMemDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 屏幕和内存设备描述表<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nX, nY, nX2, nY2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 位图宽度和高度<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xScrn, yScrn;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;// 屏幕分辨率<BR>&nbsp;&nbsp;&nbsp;&nbsp;HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;hBitmap, hOldBitmap;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//为屏幕创建设备描述表<BR>&nbsp;&nbsp;&nbsp;&nbsp;hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//为屏幕设备描述表创建兼容的内存设备描述表<BR>&nbsp;&nbsp;&nbsp;&nbsp;hMemDC = CreateCompatibleDC(hScrDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获得屏幕分辨率<BR>&nbsp;&nbsp;&nbsp;&nbsp;xScrn = GetDeviceCaps(hScrDC, HORZRES);<BR>&nbsp;&nbsp;&nbsp;&nbsp;yScrn = GetDeviceCaps(hScrDC, VERTRES);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获得全屏坐标<BR>&nbsp;&nbsp;&nbsp;&nbsp;nX = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;nY = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;nX2 = xScrn;<BR>&nbsp;&nbsp;&nbsp;&nbsp;nY2 = yScrn;<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;// 创建一个与屏幕设备描述表兼容的位图<BR>&nbsp;&nbsp;&nbsp;&nbsp;hBitmap = CreateCompatibleBitmap(hScrDC, nX2, nY2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 把新位图选到内存设备描述表中<BR>&nbsp;&nbsp;&nbsp;&nbsp;hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 把屏幕设备描述表拷贝到内存设备描述表中<BR>&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(hMemDC, 0, 0, nX2, nY2, hScrDC, nX, nY, SRCCOPY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//得到屏幕位图的句柄<BR>&nbsp;&nbsp;&nbsp;&nbsp;hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//清除 <BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hScrDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hMemDC);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iBits;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//当前显示分辨率下每个像素所占字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wBitCount;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //位图中每个像素所占字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;//定义调色板大小, 位图中像素字节大小 ,<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwPaletteSize=0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwBmBitsSize,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwDIBSize, dwWritten;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//位图属性结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPFILEHEADER&nbsp;&nbsp; bmfHdr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//位图文件头结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;&nbsp; bi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//位图信息头结构 <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER lpbi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//指向位图信息头结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fh, hDib, hPal,hOldPal=NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//定义文件,分配内存句柄,调色板句柄<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//计算位图文件每个像素所占字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;hDC = CreateDC("DISPLAY",NULL,NULL,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;iBits = GetDeviceCaps(hDC, BITSPIXEL) * <BR>&nbsp;&nbsp;&nbsp;&nbsp;GetDeviceCaps(hDC, PLANES);<BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (iBits &lt;= 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (iBits &lt;= 4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 4;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (iBits &lt;= 8)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 8;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (iBits &lt;= 24)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 24;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = iBits;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//计算调色板大小<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (wBitCount &lt;= 8)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwPaletteSize = (1 &lt;&lt;&nbsp;&nbsp;wBitCount) *<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(RGBQUAD);<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;//设置位图信息头结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= sizeof(BITMAPINFOHEADER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biWidth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Bitmap.bmWidth;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biHeight&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= Bitmap.bmHeight;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biPlanes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biBitCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= wBitCount;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biCompression&nbsp;&nbsp;&nbsp;&nbsp; = BI_RGB;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biXPelsPerMeter&nbsp;&nbsp; = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biYPelsPerMeter&nbsp;&nbsp; = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrUsed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrImportant&nbsp;&nbsp;&nbsp;&nbsp;= 0;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//为位图内容分配内存<BR>&nbsp;&nbsp;&nbsp;&nbsp;hDib&nbsp;&nbsp;= GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;*lpbi = bi;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 处理调色板&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;hPal = GetStockObject(DEFAULT_PALETTE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hPal)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDC = ::GetDC(NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获取该调色板下新的像素值<BR>&nbsp;&nbsp;&nbsp;&nbsp;GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//恢复调色板&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hOldPal)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::ReleaseDC(NULL, hDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; //创建位图文件&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; fh = CreateFile(bmpname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp; // 设置位图文件头<BR>&nbsp;&nbsp;&nbsp;&nbsp; bmfHdr.bfType = 0x4D42;&nbsp;&nbsp;// "BM"<BR>&nbsp;&nbsp;&nbsp;&nbsp; dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; bmfHdr.bfSize = dwDIBSize;<BR>&nbsp;&nbsp;&nbsp;&nbsp; bmfHdr.bfReserved1 = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; bmfHdr.bfReserved2 = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; bmfHdr.bfOffBits = (DWORD)sizeof<BR>&nbsp;&nbsp;&nbsp;&nbsp; (BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;<BR>&nbsp;&nbsp;&nbsp;&nbsp; // 写入位图文件头<BR>&nbsp;&nbsp;&nbsp;&nbsp; WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp; // 写入位图文件其余内容<BR>&nbsp;&nbsp;&nbsp;&nbsp; WriteFile(fh, (LPSTR)lpbi, dwDIBSize, <BR>&nbsp;&nbsp;&nbsp;&nbsp; &dwWritten, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp; //清除&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; GlobalUnlock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp; GlobalFree(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle(fh);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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 + -