前言:截圖對于一個C++開發者來說無非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法屏幕操作,作為一名整天想著用 C++ 開發游戲的初級 C#.NET 的程序員的我,只是自己研究區域截圖,失敗 n 多次,最后在半夢半醒中弄出來的簡單的Demo,簡單的分享一下而已。如此的班門弄斧,著實不堪,另外我的 C++ 水平也是處于入門水準,如果該博客有什么問題,請各位朋友留言指正,謝謝關照!
附件及其他:
C#的 Graphics.CopyFromScreen 方法 https://msdn.microsoft.com/zh-cn/library/fw1kt6f9.aspx
附件:http://files.VEVb.com/files/herbertchina/GetFormDemo.zip
本文Demo:(VS2010環境)
本文使用的圖片素材:
 
 
本文主題:
從窗體的圖片中截取需要的部分,本例是驗證碼區域。
正文:
先貼出主要代碼
        /// <summary>        /// 指定窗口區域截圖         /// </summary>        /// <param name="handle">窗口句柄. (在windows應用程序中, 從Handle屬性獲得)</param>        /// <param name="rect">窗口中的一個區域</param>        /// <returns></returns>        public  Bitmap CaptureWindow(IntPtr hWnd,RECT rect)        {            // 獲取設備上下文環境句柄              IntPtr hscrdc = GetWindowDC(hWnd);            // 創建一個與指定設備兼容的內存設備上下文環境(DC)              IntPtr hmemdc = CreateCompatibleDC(hscrdc);            IntPtr myMemdc = CreateCompatibleDC(hscrdc);            // 返回指定窗體的矩形尺寸              RECT rect1;            GetWindowRect(hWnd, out rect1);            // 返回指定設備環境句柄對應的位圖區域句柄              IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, rect1.Right - rect1.Left, rect1.Bottom - rect1.Top);            IntPtr myBitmap = CreateCompatibleBitmap(hscrdc, rect.Right - rect.Left, rect.Bottom - rect.Top);            //把位圖選進內存DC             // IntPtr OldBitmap = (IntPtr)SelectObject(hmemdc, hbitmap);            SelectObject(hmemdc, hbitmap);            SelectObject(myMemdc, myBitmap);            /////////////////////////////////////////////////////////////////////////////            //            // 下面開始所謂的作畫過程,此過程可以用的方法很多,看你怎么調用 API 了              //            /////////////////////////////////////////////////////////////////////////////            // 直接打印窗體到畫布              PRintWindow(hWnd, hmemdc, 0);            // IntPtr hw = GetDesktopWindow();            // IntPtr hmemdcClone = GetWindowDC(myBitmap);            BitBlt(myMemdc, 0, 0, rect.Right - rect.Left, rect.Bottom - rect.Top, hmemdc, rect.Left, rect.Top, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);            //SelectObject(myMemdc, myBitmap);            Bitmap bmp = Bitmap.FromHbitmap(myBitmap);            DeleteDC(hscrdc);            DeleteDC(hmemdc);            DeleteDC(myMemdc);            return bmp;        }講解吧:
原理步驟: 1、通過窗體 handle 創建設備上下文環境 2、根據上下文環境句柄建立對應的與設備兼容的內存設備上下文環境(理解成一塊畫板,內存上的) 3、通過窗體句柄得到長寬,通過CreateCompatibleBitmap得到窗體對應的設備環境句柄對應的位圖區域(理解成自然界的一個美麗的景色) 4、通過 SelectObject 指向性,把 3 中的位圖區域句柄對應到 2 中的內存設備上下文中(理解成,我需要畫這大自然的美麗景色,我需要有相應的畫布,這里就是在畫板上固定畫布) 5、繪圖,包括各種 API 繪圖或獲取圖形 6、此處很重要,因為我們不是要過去框架的整體圖形,我們要的是局部的,于是,我們可以通過 1 、2 、3 、4 的步驟,再建設一塊畫布(第三步有一點區別,就是長寬) 7、通過 BitBlt 方法把之前畫好的畫的一個區域復制到我們新建的畫板上, BitBlt 的功能是“對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境” 8、然后就簡單了,Bitmap bmp = Bitmap.FromHbitmap(myBitmap);把我們復制出來的第二塊畫板上的畫生成位圖圖像 9、再進行什么操作就隨你了 10、最后,最后,最最重要的是……不要忘了使用 DeleteDC 函數清除第 1 、 2 中建的上下文環境,因為這是 API,沒有java的自動清理機制
再者:
再者,哥們我是初學者,文章僅供參考,有什么問題可以百度、google,然后就是,我上面說的一定有問題,請看明白的朋友指正留言,幫助下小友學習一二!謝謝!
新聞熱點
疑難解答