歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C#對被遮擋的窗體進行截圖

C#對被遮擋的窗體進行截圖

日期:2017/3/1 10:23:25   编辑:Linux編程

最近在做的一個項目,用的地圖控件比較特殊,

在地圖上面自己繪制的東東沒辦法隨地圖一起導出成圖片

只能繞個彎,用截屏的方式了
一開始用的是這樣:

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

這個函數在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. ClientToScreen(m_pFremework.Hook.Handle, ref lphook);
  9. ScreenToClient(m_pFremework.MdiForm.Handle, ref lphook);
  10. Rectangle rect = new Rectangle(lphook.x, lphook.y, m_pFremework.Hook.Width, m_pFremework.Hook.Height);
  11. if (hdc != IntPtr.Zero)
  12. {
  13. IntPtr hdcMem = CreateCompatibleDC(hdc);
  14. if (hdcMem != IntPtr.Zero)
  15. {
  16. IntPtr hbitmap = CreateCompatibleBitmap(hdc, m_pFremework.MdiForm.Width, m_pFremework.MdiForm.Height);
  17. if (hbitmap != IntPtr.Zero)
  18. {
  19. IntPtr ip = SelectObject(hdcMem, hbitmap);
  20. if (ip != IntPtr.Zero)
  21. {
  22. bool a = PrintWindow(m_pFremework.MdiForm.Handle, hdcMem, 1);
  23. DeleteObject(hbitmap);
  24. Image tempImg = Image.FromHbitmap(hbitmap);
  25. Bitmap b = new Bitmap(tempImg);
  26. MyImage = b.Clone(rect, b.PixelFormat);
  27. }
  28. }
  29. }
  30. }
  31. return MyImage;
  32. }
Copyright © Linux教程網 All Rights Reserved