關于如何拷貝屏幕并保存,這里已經有現成的例子,我也不必去Copy人家了,我一向不喜歡Copy。這里有一個完整的例子,可以看看。
[http://msdn.microsoft.com/EN-US/library/windows/desktop/dd183402(v=vs.85).aspx](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,NOTSRCCOPY);

但是你會發現,當進行多次操作,窗口上顯示的有一部分變成了正色,為什么呢?因為在你第二次截屏時,窗口中顯示了上一次的截屏的內容,是反色的,而對反色再進行反色,不就變成了正色了嗎?負負得正,所以才會看到像下圖所示的效果。

- 前言
- (1):關于C++的幾個要點
- (2):完整的開發流程
- (3):窗口的重繪
- (4):創建菜單
- (5):具有單選標記的菜單
- (6):創建右鍵菜單
- (7):多邊形窗口
- (8):繪圖(A)
- (9):繪圖(B)
- (10):繪圖(C)
- (11):使用控件——先來耍一下按鈕
- (12):使用控件——單選按鈕
- (13):握手對話框
- (14):用對話框作為主窗口
- (15):ListView控件
- (16):ListView的多個視圖
- (17):啟動和結束進程
- (18):使用對話框的兩個技巧
- (19):瀏覽和打開文件
- (20):瀏覽文件夾
- (21):復制&粘貼&剪貼板操作
- (22):抓取屏幕
- (23):漸變顏色填充
- (24):計時器
- (25):監視剪貼板