动态截获并显示窗口DC

我在网上看到很多屏幕截取的文章,相信大家也看过不少。人类每一次的进步总是建立在别人的基础之上,我今天要做得是如何将一个窗口动态地显示在另外一个窗口上。

方法很简单,核心算法是要完成对一个窗口DC显示到另外一个窗口的DC,为了方便代码的重用,我特地把它放到一个自己编写的函数:

BOOL CShow_WindowDCView::Show_WindowDC(CWnd *pWndDest /*目标窗口的wnd指针*/,
CWnd *pWndSrc /*源窗口*/)
{
  //当然正规点还得判断它IsKindof(“CWnd”),这里我就偷懒了
  if(pWndDest==NULL || pWndSrc==NULL) return FALSE;
  CRect SrcRect;
  pWndSrc->GetWindowRect(&SrcRect);
  // 内存设备描述表
  HDC hSrcDC, hMemDC;
  // 位图句柄
  HBITMAP hBitmap, hOldBitmap;
  // 位图宽度和高度
  int nWidth, nHeight;
  pWndSrc->Invalidate();
  hSrcDC=pWndSrc->GetDC()->m_hDC;
  // 创建一个与源窗口设备描述表兼容的内存设备描述表
  hMemDC = CreateCompatibleDC(hSrcDC);
    nWidth = SrcRect.Width();
  nHeight = SrcRect.Height();
  // 创建一个与源窗口设备描述表兼容的位图
  hBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight);
  // 把新位图选到内存设备描述表中  
  hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
  // 把屏幕设备描述表拷贝到内存设备描述表中
  BitBlt(hMemDC, 0, 0, nWidth, nHeight,hSrcDC, 0, 0, SRCCOPY);
  //得到位图的句柄
  hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
  CRect DestRect;
  GetWindowRect(&DestRect);
  CDC dcMem;
  //创建一个与目标窗口设备描述表兼容的位图
  dcMem.CreateCompatibleDC(GetDC());
  HBITMAP poldBitmap=(HBITMAP)SelectObject(dcMem.m_hDC,hBitmap);
  GetDC()->StretchBlt(0,0 ,
              DestRect.Width(),
              DestRect.Height(),
              &dcMem,0 ,0,
              nWidth,nHeight,
              SRCCOPY); //显示位图
  //善后工作
  DeleteDC(hSrcDC);
  DeleteDC(hMemDC);
  dcMem.SelectObject(poldBitmap);
  dcMem.DeleteDC();
  return TRUE;
}

时间: 2024-08-03 07:37:20

动态截获并显示窗口DC的相关文章

mfc 动态创建窗口-一个CWnd对象的onpaint函数中,动态Create两个子窗口时造成wincore.cpp中的断言错误。

问题描述 一个CWnd对象的onpaint函数中,动态Create两个子窗口时造成wincore.cpp中的断言错误. 一个对话框子类CViewDlg 在onpaint函数中需要再动态创建两个子窗口 void CViewDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 CRect rect; GetClientRect(&rect); m_wnd1->Create

创建不在任务条中显示窗口按钮的应用

现在有很多应用程序都使用系统托盘区来放置图标,这时候如果窗口的按钮再出现在任务条中就显得有些多余.创建不在任务条中显示窗口按钮的应用时可以使用下面的一些方法:创建对话框应用,创建一个POPUP窗口.但是对于一些已经使用文档/视结构开发好的程序来说要进行修改就比较困难,下面介绍一种简单的方法可以很方便的实现这一功能,而且对程序的改动也不大. 这种方法的实质创建一个隐藏的窗口,做为当前应用中框架窗口的父窗口.你需要对程序进行一点改动以适应这种需要. 首先:在你的CFrameWnd派生类中定义一个CW

JS使用oumousemove和oumouseout动态改变图片显示的方法

 本文实例讲述了JS使用oumousemove和oumouseout动态改变图片显示的方法.分享给大家供大家参考.具体如下: 鼠标放到图片上时图片会自动变大,鼠标离开图片还原 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html> <html> <head> <script> function bigImg(x) { x.style.height=&q

教你使用Win7系统各种显示窗口方式

  工作或者各种需要,同时打开多个窗口,同时在多个窗口中操作,都是不可避免的.然而在同时打开多个窗口的时候,我们就需要掌握Win7系统各种显示窗口 ,如窗口的排列.摆布.显示方式就显得尤其重要了,好的摆布方式有利于提高工作效率,减少工作量. 操作步骤 1. 首先在任务栏空白的地方点击右键,然后在弹出的菜单栏中你会发现有"层叠窗口"."堆叠显示窗口"."并排显示窗口"这三个选单.然后你就可以根据自己的需要,选择自己适用的显示窗口方式了. 2. 层叠

winpcap-为什么显示窗口,已停止工作?

问题描述 为什么显示窗口,已停止工作? #define HAVE_REMOTE#include #include /* 4 bytes IP address /typedef struct ip_address{u_char byte1;u_char byte2;u_char byte3;u_char byte4;}ip_address;/ IPv4 header /typedef struct ip_header{u_char ver_ihl; / Version (4 bits) + Int

OPENCV加载了图像,可是显示窗口出不来,鼠标放到窗口上鼠标显示忙的图标

问题描述 OPENCV加载了图像,可是显示窗口出不来,鼠标放到窗口上鼠标显示忙的图标 OPENCV加载了图像,可是显示窗口出不来,鼠标放到窗口上鼠标显示忙的图标,求解答... 确信代码到这里没有问题,环境也没问题,代码没有报错,常规写代码播放没问题,放到这个逐帧处理视频画面的代码里就跑不起来 解决方案 加个waitKey(25)试试 解决方案二: 没有加载成功吧,贴一些代码看看.

mfc 图像的显示-vc中实现下图显示,既有文字信息,又有图像显示框动态变化的显示,请高手指点这是用的什么控键?

问题描述 vc中实现下图显示,既有文字信息,又有图像显示框动态变化的显示,请高手指点这是用的什么控键? 解决方案 首先,图确实看不清楚.其次,是控件.最后,可能没有标准的控件可以实现,可以考虑 DIRECTUI界面框架,或其它第三方控件. 解决方案二: 最好是用第三方界面库,可以支持这种复杂要求 解决方案三: 求大神们给予帮助,有能者可以实现的,可以有偿服务!

m spinplacesite-在ATL简单对象中如何显示窗口(小白求助)

问题描述 在ATL简单对象中如何显示窗口(小白求助) 创建了一个ATL简单对象,然后在构造函数里显示窗口.想获得网页的句柄,上网查资料 HDC hDC; HWND hWnd ; // Get the HDC from the client m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC); // Get the HWND from the HDC hWnd = WindowFromDC(hDC); m_spInPlaceSite->Rel

解决织梦中动态页面不显示数据问题

!于是开始检查服务器的各项配置,检查来检查去也没有什么问题,就是网速慢了一点.于是开始了各种的折腾......,终于发现问题的所在....那就是没有连接数据库...于是开始排查数据库发现,数据少了很多的文件...居然被杀毒软件当作病毒给删除了(小编有个建议,经常给服务器杀毒,不要让重要文件感染病毒以免被误杀.)      dedecms动态页面不显示数据有如下原因:         1.dedecms程序的问题,可用以往的排错方式进行排错.         2.系统环境的问题.检测iis是否加载