歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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.         }  
Copyright © Linux教程網 All Rights Reserved