【问题标题】:C++ Take a Screenshot [closed]C ++截屏[关闭]
【发布时间】:2017-11-01 08:07:30
【问题描述】:

我是 C++ 新手,必须截屏。我想我已经设置了除了打印方法本身之外的所有东西,这就是我正在努力的地方。

我在 so 上找到了一篇文章,其中描述了如何截取屏幕截图,但不知何故它对我不起作用。 (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 是否有意义 已经得到一个作为参数。任何帮助表示赞赏。

【问题讨论】:

  • 定义“打印它” - 这可能意味着很多事情
  • @BoundaryImposition 打印部分对我来说有点神奇。我认为这已经发生在其他地方。问题出在打印预览中,我的 Wpf 视图应该在的地方,只有一个框架,里面有一个空白空间。所以我猜标题有点误导,如果我理解正确的话,这个方法并不是真正的打印,即使它的名字是打印。
  • 嗯...即使它具有魔力,您也必须以某种方式与之互动。 定义您希望如何使用屏幕截图
  • @user3292642:好吧,如果问题与打印无关,那么您应该从问题中删除对它的提及。
  • @user3292642:你最后的评论简直是无用的冒犯。 BoundaryImposition 有一部分是对的,你的问题不清楚,所以我问你这个方法的 HDC 参数是什么。

标签: c++ winapi gdi


【解决方案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;
}

【讨论】:

  • 感谢您的回答... WinAPI 调用是指GetDC?
  • 感谢工作。预览不再为空;) 左、上、宽和高似乎还不正确,但这应该不是问题。再次非常感谢!
  • @user3292642:你至少应该测试一下BitBlt的返回值...
  • 返回值为1。
  • @user3292642 查看我的编辑...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2013-01-23
  • 1970-01-01
  • 2021-02-09
  • 2013-01-26
相关资源
最近更新 更多