在VC中如何实现抓取整个屏幕图象

在谈程序之前,先介绍一下位图的基本结构

       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);

}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值