C#对被遮挡的窗体进行截图


最近在做的一个项目,用的地图控件比较特殊,

在地图上面自己绘制的东东没办法随地图一起导出成图片

只能绕个弯,用截屏的方式了
一开始用的是这样:

  1. /// <summary>   
  2. /// 截图   
  3. /// </summary>   
  4. /// <returns></returns>   
  5. private Image CaptureScreen()  
  6. {  
  7.     Image MyImage = null;  
  8.   
  9.     //获得当前地图控件的大小   
  10.     Graphics grapScreen = m_pFremework.Hook.CreateGraphics();  
  11.   
  12.     //Rectangle rect = new Rectangle();   
  13.     //rect = Screen.GetWorkingArea(m_pFremework.Hook);//范围不准确,直接使用控件的属性   
  14.     Rectangle rect = new Rectangle(0, 0, m_pFremework.Hook.Width, m_pFremework.Hook.Height);  
  15.     MyImage = new Bitmap(rect.Width, rect.Height, grapScreen);  
  16.     Graphics grapImage = Graphics.FromImage(MyImage);  
  17.     IntPtr dc1 = grapScreen.GetHdc();  
  18.     IntPtr dc2 = grapImage.GetHdc();  
  19.       
  20.     BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376);  
  21.   
  22.     //释放掉DC   
  23.     grapScreen.ReleaseHdc(dc1);  
  24.     grapImage.ReleaseHdc(dc2);  
  25.     return MyImage;  
  26. }  

这个函数在win7中没有任何问题,但在xp中发现,任何遮挡到地图控件的窗体都被截下来了
网上搜搜,发现了一个PrintWindow API可以解决这个问题,用下来发现这个只能截整个窗体,
无法单独截取地图控件,这个就简单了,直接使用BitMap的Clone函数裁剪出来地图控件部分就搞定了,
代码是这个样子:

  1. private Image CaptureScreen2()  
  2.         {  
  3.             Image MyImage = null;  
  4.             IntPtr hdc = GetWindowDC(m_pFremework.MdiForm.Handle);  
  5.             LPPOINT lphook = new LPPOINT();  
  6.             lphook.x = 0;  
  7.             lphook.y = 0;  
  8.   
  9.             ClientToScreen(m_pFremework.Hook.Handle, ref lphook);  
  10.             ScreenToClient(m_pFremework.MdiForm.Handle, ref lphook);  
  11.             Rectangle rect = new Rectangle(lphook.x, lphook.y, m_pFremework.Hook.Width, m_pFremework.Hook.Height);  
  12.             if (hdc != IntPtr.Zero)  
  13.             {  
  14.                 IntPtr hdcMem = CreateCompatibleDC(hdc);  
  15.                 if (hdcMem != IntPtr.Zero)  
  16.                 {  
  17.                     IntPtr hbitmap = CreateCompatibleBitmap(hdc, m_pFremework.MdiForm.Width, m_pFremework.MdiForm.Height);  
  18.                     if (hbitmap != IntPtr.Zero)  
  19.                     {  
  20.                         IntPtr ip = SelectObject(hdcMem, hbitmap);  
  21.                         if (ip != IntPtr.Zero)  
  22.                         {  
  23.                             bool a = PrintWindow(m_pFremework.MdiForm.Handle, hdcMem, 1);  
  24.                             DeleteObject(hbitmap);  
  25.                             Image tempImg = Image.FromHbitmap(hbitmap);  
  26.                             Bitmap b = new Bitmap(tempImg);  
  27.                             MyImage = b.Clone(rect, b.PixelFormat);  
  28.                         }  
  29.                     }  
  30.                 }  
  31.             }  
  32.   
  33.             return MyImage;  
  34.         }  
  • 1
  • 2
  • 下一页

相关内容