2012-01-02 3 views
0

Это то, что я сейчас делаю:Получение отдельных пикселей другого окна с BitBlt

  • ПОЛУЧИТЬ окно 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

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

«Рамка должна быть выбрана в контексте устройства, в противном случае 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; 
} 
+0

Я уверен, что X/Y значения в моих GetPixel звонки уже смещает не абсолютные местоположения. –

+0

Вам все равно нужно выбрать растровое изображение в совместимый DC, иначе BitBlt не сможет копировать пиксели. Кроме того, используйте GetDIBits - это намного быстрее, чем использование GetPixel. –

+0

Спасибо, теперь он работает! –

Смежные вопросы