抓取屏幕图像及光标的程序分析

 

本文将给出VC++6.0下实现抓取整个屏幕图像及光标区域的具体步骤及程序代码。闲话少说,让我们来看看具体的实现方法吧!

第一步:通过AppWizard生成一个工程名为GrabScreen的单文档工程,注意在最后一步中选择你的View类(本例中为CGrabScreenView)的派生基类为CscrollView,以便能够滚动显示整个屏幕图像。

第二步:用以下代码修改CGrabScreenView中的OnInitialUpdate函数使视图区的滚动范围为整个屏幕大小。

void CGrabScreenView::OnInitialUpdate()

{

       CScrollView::OnInitialUpdate();

 

       CSize sizeTotal;

       // TODO: calculate the total size of this view

       sizeTotal.cx =GetSystemMetrics(SM_CXSCREEN);

       sizeTotal.cy =GetSystemMetrics(SM_CYSCREEN);

       SetScrollSizes(MM_TEXT, sizeTotal);

}

第三步:在主菜单条的编辑菜单下添加一子菜单项,IDIDM_EDIT_SCREEN,标题为“抓取全屏”。通过ClassWizardCGrabScreenView中添加该菜单项的命令响应函数,采用ClassWizard建议的函数名称OnEditScreen

第四步:在OnEditScreen函数中实现抓取整个屏幕图像及光标区域。

首先在CgrabScreenView类定义中增加成员变量HDC m_hdcCompatibleHBITMAP m_hbmScreen,分别对应整个屏幕图像及光标区域的兼容设备描述表和兼容位图。然后用下面给出的程序代码获取所需数据。

void CGrabScreenView::OnEditScreen()

{

       // TODO: Add your command handler code here

       //获取全屏幕窗口的设备描述表

       HDC hdcScreen=::GetDC(NULL);

       //产生全屏幕窗口设备描述表的兼容设备描述表

       m_hdcCompatible=CreateCompatibleDC(hdcScreen);

       //产生全屏幕窗口设备描述表的兼容位图

       HBITMAP m_hbmScreen=CreateCompatibleBitmap(hdcScreen,

                     GetDeviceCaps(hdcScreen,HORZRES),GetDeviceCaps(hdcScreen,VERTRES));

       //将兼容位图选入兼容设备描述表

       SelectObject(m_hdcCompatible,m_hbmScreen);

       //将全屏幕窗口位图的象素数据拷贝到兼容设备描述表

       BitBlt(m_hdcCompatible,0,0,GetDeviceCaps(hdcScreen,HORZRES),

                     GetDeviceCaps(hdcScreen,VERTRES),hdcScreen,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重画窗口

       Invalidate();   

}

第五步:在窗口重画函数OnDraw中将m_hdcCompatible中的图像拷贝到CgrabScreenView的设备描述表上,从而在该窗口中抓取的屏幕及光标区域。

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、付费专栏及课程。

余额充值