2017-05-31 341 views
-5

我是C++新手,必須截取屏幕截圖。我想我已經設置了除了打印方法本身之外的所有東西,這就是我正在掙扎的地方。C++截取屏幕截圖

我發現了一篇關於如何截圖的文章,但它對我來說不起作用。 (How to capture part of the screen and save it to a BMP?

我的方法是這樣的:

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr) 
{ 
    HDC hdcSource = GetDC(NULL); 
    HDC hdcMemory = CreateCompatibleDC(hdcSource); 

    int capX = GetDeviceCaps(hdcSource, HORZRES); 
    int capY = GetDeviceCaps(hdcSource, VERTRES); 

    HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource, pCr->Width(), pCr->Height()); 
    HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hBitmap); 

    BitBlt(hdcMemory, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, SRCCOPY); 

    DeleteDC(hdcSource); 
    DeleteDC(hdcMemory); 

    return S_OK; 
} 

問題是截圖似乎是一個空的位圖。 我真的不知道我是否有意義創建一個新的HDC當我 已經獲得一個參數。任何幫助表示讚賞。

+0

定義「打印」 - 這可能意味着任何的許多事情 –

+0

@BoundaryImposition打印部分是有點神奇的給我。我認爲這已經發生在別的地方。問題出現在打印預覽中我的Wpf視圖應該在的地方,裏面只有一個空白空間的框架。所以我猜這個標題有點誤導,如果我理解正確,這種方法並不是真正的打印,即使它的名字是Print。 – user3292642

+0

嗯......即使它的魔力,你也不得不以某種方式與它互動。 **定義**你希望如何使用屏幕截圖 –

回答

1

我無法測試,因爲我不知道調用該方法的框架是什麼,但是當您收到要寫入的HDC時,您不應該使用內存DC並直接使用BitBlt。但你也應該測試WinAPI的返回值調用錯誤條件返回給調用者:

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr) 
{ 
    HDC hdcSource = GetDC(NULL); 
    if (NULL == hdcSource) return E_FAIL; 

    HRESUL cr = S_OK; 

    if (!BitBlt(hdc, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, 
     SRCCOPY)) cr = E_FAIL; 

    DeleteDC(hdcSource); 

    return cr; 
} 
+0

感謝您的回答... WinAPI調用您的意思是'GetDC'? – user3292642

+0

謝謝你的工作。預覽不再是空的;)左側,頂部,寬度和高度似乎還不正確,但這應該不成問題。再一次非常感謝你! – user3292642

+0

@ user3292642:您應該至少測試BitBlt的返回值... –