C++ 截图
C++ Take a Screenshot
我是 C++ 新手,必须截图。我想我已经设置了打印方法本身之外的所有内容,这就是我正在努力的地方。
我在 so 上找到了一个 post,它描述了如何截取屏幕截图,但它对我不起作用。 (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
是否有意义
已经得到一个作为参数。感谢任何帮助。
我无法测试,因为我不知道调用该方法的框架是什么,但是当您收到要写入的 HDC 时,您根本不应该使用内存 DC 并直接在那里使用 BitBlt。但是您还应该测试 WinAPI 调用的 return 值 return 错误条件给调用者:
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;
}
我是 C++ 新手,必须截图。我想我已经设置了打印方法本身之外的所有内容,这就是我正在努力的地方。
我在 so 上找到了一个 post,它描述了如何截取屏幕截图,但它对我不起作用。 (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
是否有意义
已经得到一个作为参数。感谢任何帮助。
我无法测试,因为我不知道调用该方法的框架是什么,但是当您收到要写入的 HDC 时,您根本不应该使用内存 DC 并直接在那里使用 BitBlt。但是您还应该测试 WinAPI 调用的 return 值 return 错误条件给调用者:
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;
}