Получение отдельных пикселей другого окна с помощью BitBlt - PullRequest
0 голосов
/ 02 января 2012

Это то, что я сейчас делаю:

  • получить окно DC через GetWindowDC
  • создать совместимый DC с CreateCompatibleDC
  • вызов GetPixel на моем совместимом DC

К сожалению, все мои вызовы GetPixel возвращаются CLR_INVALID.Вот мой код.

bool Gameboard::Refresh()
{
  bool  ret = false;
  HDC   context, localContext;

  context = GetWindowDC(m_window);
  if (context != NULL)
  {
    localContext = CreateCompatibleDC(context);
    if (localContext != NULL)
    {
      if (BitBlt(localContext, 0, 0, GameboardInfo::BoardWidth, GameboardInfo::BoardHeight,
        context, GameboardInfo::TopLeft.x, GameboardInfo::TopLeft.y, SRCCOPY))
      {
        ret = true;
        // several calls to GetPixel which all return CLR_INVALID
      }
      DeleteDC(localContext);
    }
    ReleaseDC(m_window, context);
  }
  return ret;
}

Есть идеи?

1 Ответ

1 голос
/ 02 января 2012

Я считаю, что вам нужно выбрать растровое изображение в контексте вашего устройства.

"Растровое изображение должно быть выбрано в контексте устройства, в противном случае CLR_INVALID возвращается для всех пикселей." - GetPixel ()

bool Gameboard::Refresh()
{
  bool  ret = false;
  HDC   context, localContext;


  HGDIOBJ origHandle;


  context = GetWindowDC(m_window);
  if (context != NULL)
  {
    localContext = CreateCompatibleDC(context);


    origHandle = SelectObject(localcontext,CreateCompatibleBitmap(context, GameboardInfo::BoardWidth, GameboardInfo::BoardHeight));


    if (localContext != NULL)
    {
      if (BitBlt(localContext, 0, 0, GameboardInfo::BoardWidth, GameboardInfo::BoardHeight,
        context, GameboardInfo::TopLeft.x, GameboardInfo::TopLeft.y, SRCCOPY))
      {
        ret = true;
        // several calls to GetPixel which all return CLR_INVALID
      }

      SelectObject(localcontext, origHandle);


      DeleteDC(localContext);
    }
    ReleaseDC(m_window, context);
  }
  return ret;
}
...