關於如何拷貝屏幕並保存,這裡已經有現成的例子,我也不必去Copy人家了,我一向不喜歡Copy。 這裡有一個完整的例子,可以看看。
http://msdn.microsoft.com/EN- US/library/windows/desktop/dd183402(v=vs.85).aspx
把屏幕的內容復制到窗口的客戶區域中 ,通常會用BitBlt函數,函數的功能是把一塊顏色數據從一個DC復制到另一個DC,這個我也不知道怎麼 翻譯才能通俗一點。這樣說吧,就是從源設備上下文的圖形表面截取一個矩形區域並且復制到另一個設 備上下文的區域中。就像我們要做一個截屏工具一樣,把屏幕的一部分內容復制到窗口上。
下 面呢,我用另一個函數來進行拷貝——StretchBlt函數,這個函數與BitBlt差不多,不過,它有一點, 就是可以根據目標的區域對源圖像進行拉伸。
注意看代碼。
{ // 屏幕的DC HDC hdcScreen = GetDC(NULL); // 本窗口的DC HDC hdcWindow = GetDC(hWnd); // 屏幕的寬度 int scrWidth = GetSystemMetrics(SM_CXSCREEN); // 屏幕的高度 int scrHeight = GetSystemMetrics(SM_CYSCREEN); // 窗口的客戶區域 RECT rectClient; GetClientRect(hWnd, &rectClient); // 使用StretchBlt進行復制 StretchBlt (hdcWindow,0,0,rectClient.right,rectClient.bottom,hdcScreen,0,0,scrWidth,scrHeight,SRCCOPY ); // 釋放DC ReleaseDC(NULL, hdcScreen); ReleaseDC(hWnd, hdcWindow); }
現在,我們要明確,我們是要把屏幕上的東西往窗口區域復制,所以我們想到,必須先有兩 個DC,一個是屏幕的DC,另一個就是窗口的DC。DC通過GetDC函數可以獲取,將參數設置為NULL,也就 是獲得主屏幕的DC句柄了,NULL可以認為獲取桌面的DC。
獲取到DC後,我們還必須知道源區域 的寬度和高度,以及目標窗口區域的寬度和高度。
源區域是屏幕,所以我們只要知道了當前屏 幕的高度和寬度就可以了,GetSystemMetrics(SM_CXSCREEN)返回當前屏幕的寬度,GetSystemMetrics (SM_CYSCREEN)獲得當前屏幕的高度。
而窗口的區域大小呢?我們不妨先得到窗口客戶區域的矩 形大小,用GetClientRect函數填充一個RECT結構體,這個結構體的right成員就是窗口客戶區域的寬度 ,bottom成員就是窗口客戶區域的高度了。
好了,有了這些基本參數,後面的事情就好辦了。
BOOL StretchBlt( _In_ HDC hdcDest, _In_ int nXOriginDest, _In_ int nYOriginDest, _In_ int nWidthDest, _In_ int nHeightDest, _In_ HDC hdcSrc, _In_ int nXOriginSrc, _In_ int nYOriginSrc, _In_ int nWidthSrc, _In_ int nHeightSrc, _In_ DWORD dwRop);
以上是 StretchBlt函數的聲明,帶“Dest”字樣的都與目標區域有關,帶“Src”字樣的都與源區域有關,至 於什麼含義,看參數名字就知道了,你懂的。
最後一個參數,是一個標志,就是告訴函數用什 麼形式去復制,我們這裡使用SRCCOPY就是按源來的數據復制,不作修改。這個參數可以在Wingdi.h找 到,說明在MSDN文檔。
現在,你可以看看它的效果。
再如,如果我把StretchBlt的最後一個參數改為NOTSRCCOPY,這就使得源區域與當前區域進行取反 ,也就是我們常說的“反色”。再看看。
StretchBlt (hdcWindow,0,0,rectClient.right,rectClient.bottom,hdcScreen,0,0,scrWidth,scrHeight,NOTSRCC OPY);
但是你會發現,當進行多次操作,窗口上顯示的有一部分變成了正色,為什麼呢?因為在你第二次 截屏時,窗口中顯示了上一次的截屏的內容,是反色的,而對反色再進行反色,不就變成了正色了嗎? 負負得正,所以才會看到像下圖所示的效果。