在谈程序之前,先介绍一下位图的基本结构
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++6.0下实现抓取整个屏幕图像及光标区域的具体步骤及程序代码。
VC/MFC 抓取屏幕、按指定长宽抓取、抓取后的图像以jpg保存在D盘
VC 抓图、截屏模块源码,作者:徐景周,功能:可以轻易抓取屏幕上任意你想要抓取的活动窗口,按F3键将选中图像复制到系统剪切板中。 操作方法:点击按钮后开始抓取图像,用鼠标选中您要抓取的图像范围后(鼠标会...
VC/MFC做的抓屏,并把抓取的图片保存为JPG图像,可以给各位做个参考
用vC6.0 语言编写的,C/S 结构,用于远程抓取指定IP电脑屏幕内容源代码。
打开mouse下工程,编译运行,点击开始抓图,然后移动鼠标到要抓图的窗口,点击鼠标中键抓图到剪贴板. 本程序是在贺成士的"一个简单的鼠标钩子程序"基础上做的.
该模块主要用于抓取屏幕信息,进行数据压缩,然后划分数据报,向服务器端发送数据,并等待服务器发来的确认信息。 服务器端模块 该模块主要用于接收客户端发送的数据报,然后向客户端发送确认信息,接着组合数据...
08_CaptureVideo 在VC中实现视频采集及截图功能。 第17章(\ Chapter17) 示例描述:本章介绍VC6在ActiveX方面的应用技术。 01_MyActiveX 创建ActiveX控件。 02_MyActiveX2 为ActiveX控件增加属性和方法。...
内容索引:VC/C++源码,图形处理,抓屏,截图,屏幕捕获 VC++截图程序,可以抓取当前屏幕,完成按下键盘的“PringScreenSysRq“键的...不同的是,这个程序还可以在抓取框中滚动抓取来的屏幕,可将其直接保存为BMP位图文件。