2017-05-31 342 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的返回值... –