在谈程序之前,先介绍一下位图的基本结构
256色以及更低色的位图,一般由三部分组成,一是位图信息头,定义了位图的大小等信息,二是颜色表,说明了位图中各个象素点红,绿,蓝三原色各个分量的值,三是位图的象素数据块,定义了位图中每个象素点的数据,它与第二条的颜色信息一起构成了图形的最终显示.
而对于大于256色的位图,一般由两部分组成,一是位图信息头,而是位图的象素快, 他定义了每个象素点的数据以及各个象素点的红,绿,蓝三原色分量.
有了这些之后,开始写程序实践一下吧
首先新建一个基于单文档界面的MFC应用程序,在编辑菜单项下建一个IDM_EDIT_SCREEN的子项,名为抓取屏幕,为它添加消息响应函数(在视图类中),然后在视类中定义两个私有的成员变量
HDC m_hDcCompatible //用来保存兼容DC设备上下文
HBITMAP m_hBitmap; //用来保存位图句柄
void CTestView::OnEditScreen()
{
HDC hdc = ::GetDC();
m_hDcCompatible = ::CreateCompatible(hdc); //创建兼容设备上下文DC
m_hBitmap = ::CreateCompatibleBitmap(hdc,GetDevice(hdc,HORZRES),GetDeviceCaps(hdc,VERTRES));
::SelectObject(m_hDcCompatible,m_hBitmap);//将兼容位图选入兼容设备中
::BitBlt(m_hdcCompatible,0,0,GetDeviceCaps(dc,HORZRES),
GetDeviceCaps(dc,HORZRES),dc,0,0,SRCCOPY);//将位图数据拷贝到兼容设备中
HCURSOR hCursor=GetCursor();
POINT ptCursor;
GetCursorPos(&ptCursor);
//获取光标的图标数据
ICONINFO IconInfo;
if (GetIconInfo(hCursor, &IconInfo))
{
ptCursor.x -= ((int) IconInfo.xHotspot);
ptCursor.y -= ((int) IconInfo.yHotspot);
if (IconInfo.hbmMask != NULL)
DeleteObject(IconInfo.hbmMask);
if (IconInfo.hbmColor != NULL)
DeleteObject(IconInfo.hbmColor);
}
//在兼容设备描述表上画出该光标
DrawIconEx(
m_hdcCompatible, // handle to device context
ptCursor.x, ptCursor.y,
hCursor, // handle to icon to draw
0,0, // width of the icon
0, // index of frame in animated cursor
NULL, // handle to background brush
DI_NORMAL | DI_COMPAT // icon-drawing flags
);
//使窗口无效,调用OnDraw重画窗口
::ReleaseDC(m_hWnd,dc);
Invalidate();
}
然后在ONDRAW中输出图形
void CGrabScreenView::OnDraw(CDC* pDC)
{
CGrabScreenDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
SelectObject(pDC->m_hDC,m_hBmScreen);
BitBlt(pDC->m_hDC,0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CXSCREEN),m_hdcCompatible,0,0,SRCCOPY);
}
分享到:
相关推荐
在VC++编程中,创建一个能够抓取屏幕图像和光标的程序是一项常见的需求。这个程序的实现主要依赖于Windows API函数,尤其是与图形设备接口(GDI)相关的函数。在这个过程中,我们将详细讨论如何通过VC++6.0来实现这...
在C++编程领域,捕获屏幕图像是一项常见的需求,特别是在开发图形用户界面或者进行自动化测试时。本篇文章主要探讨如何在VC++6.0环境下利用C++语言来实现这一功能,包括获取整个屏幕的图像以及特定光标区域的图像。 ...
在这个过程中,我们需要利用Windows API(应用程序接口)提供的功能来实现屏幕的抓取和保存为图像文件。下面将详细阐述如何在VC++中进行屏幕捕获。 首先,屏幕捕获的基本原理是获取桌面窗口的设备上下文(Device ...
在本文中,我们将介绍如何使用VC++编程来实现屏幕取词的功能。屏幕取词是指从屏幕上截取某个区域的图像,并将其保存到剪贴板或磁盘文件中。下面我们将逐步介绍在Windows95下的实现过程。 确定屏幕截取的区域 首先...
标题中的“抓取窗口图形到剪贴板vc6.0源码”指的是使用Microsoft Visual C++ 6.0(简称VC6.0)开发的一种能够捕获屏幕上指定窗口的图像并将其复制到剪贴板的程序。这个程序的核心功能是截图,特别是针对特定窗口的...
标题中的“可以聊天传送文件抓取屏幕 .rar_屏幕 VC”指的是一个使用VC++(Visual C++)编写的软件,该软件集成了聊天、文件传输和屏幕截图功能。这个程序可能是一个简易版的通讯工具,允许用户在聊天过程中发送文本...
在IT行业中,远程屏幕抓取是一项实用的技术,它允许用户从一台计算机(客户端)获取另一台计算机(服务器端)的屏幕图像。在这个场景下,我们讨论的是使用Microsoft Visual C++ 6.0(简称vC6.0)编程环境实现的C/S...
接着,使用`CreateDIBSection()`创建一个设备无关位图(DIB),用于存储抓取的屏幕图像。 在获取了屏幕的DC后,使用`BitBlt()`函数将屏幕内容复制到DIB。`BitBlt()`函数执行像素级别的复制,它需要源DC、目标DC、...
在VC++中,实现屏幕抓取主要涉及Windows API中的几个关键函数,如`GetDC()`、`BitBlt()`和`CreateBitmap()`等。`GetDC()`函数用于获取设备上下文(Device Context,DC),这是Windows系统中表示设备(如显示器)的一...
同时,屏幕截图技术(如BitBlt)用于定期抓取屏幕图像并发送到服务器。 服务器端则接收并存储这些信息,可能使用数据库来组织和管理大量的监控数据。数据库的选择可能有多种,如SQL Server、MySQL或SQLite,它们...
在这里,我们将桌面DC的内容复制到我们的位图上,完成屏幕的抓取。为了获取整个屏幕,我们需要提供屏幕的宽度和高度,以及适当的源和目标矩形坐标。 最后,我们使用`SaveBitmapToFile()`函数(这通常是你自定义的...
屏幕取词的核心技术在于如何准确地从屏幕图像中识别出用户选定的文字。这需要开发者对Windows API有深入理解,以便获取屏幕上的像素数据。同时,OCR技术的应用至关重要,它能够将捕获的图像转换为可编辑的文本。在VC...
屏幕抓取工具是一种实用软件,它允许用户轻松地捕获屏幕上的任何部分或整个屏幕,并将其保存为图像文件。在IT行业中,这类工具通常用于快速记录和分享问题、教程、设计稿或者演示过程。QQ的屏幕抓取功能是其众多功能...
标题中的“桌面图片抓取 桌面保存成图片”是指一种技术,它允许开发者或用户将计算机桌面的当前状态捕获为图像文件,通常用于屏幕截图或记录工作过程。这个程序的功能是运行后自动将当前桌面的显示内容转换为BMP格式...
- **创建位图对象**:在内存中创建一个位图对象,其大小与屏幕分辨率相同,用于存储屏幕图像数据。 - **复制屏幕内容到位图**:调用GDI函数如`BitBlt`,将屏幕内容复制到刚才创建的位图中。 - **保存位图为图片...
同时,为了实现视频编码,开发者可能使用如DirectX Media Object (DMO) 或者 Media Foundation Transform (MFT) 这样的组件,它们提供了高效的视频编码能力,能够将连续的屏幕图像转换为压缩的视频流。 在...
2. **图像处理**:截取到的屏幕图像需要存储在内存中,通常以位图(Bitmap)的形式。开发者需要理解和使用GDI+(Graphics Device Interface Plus)库来创建、操作和保存位图。 3. **用户交互**:实现QQ风格的截图,...
标题中的“聊天传送文件抓取屏幕”指的是一个网络应用程序,它不仅支持用户间的基本文本聊天功能,还具备发送文件和屏幕截图的能力。这样的程序在实际应用中非常实用,尤其是在远程协作、在线教育或技术支持场景下。...
7. **指定长宽抓取**:如果需要按指定尺寸抓取屏幕,可以在调用`BitBlt`前先调整目标位图的大小,然后只复制屏幕的一部分。通过设置`BitBlt`的源矩形和目标矩形参数可以实现这一点。 8. **错误处理**:在实际编码...
接下来,我们需要创建一个位图对象来存储屏幕图像。使用`CreateCompatibleBitmap`函数创建一个与屏幕DC兼容的位图,然后使用`SelectObject`将位图选入内存DC。这时,我们就可以调用`BitBlt`函数进行实际的截图操作了...