2013-10-02 56 views
0

我的操作系統是Windows 7 64位和2個顯示器。Windows API`GetPixel()'總是返回`CLR_INVALID`,但是`SetPixel()`工作正常嗎?

我用GetPixel(),但它總是返回CLR_INVALID作爲導致這樣的:

COLORREF result = GetPixel(dc,x,y); 

GetDeviceCaps(RASTERCAPS)返回結果RC_BITBLT啓用。 GetDeviceCaps(COLORMGMTCAPS)返回結果爲CM_GAMMA_RAMP

最重要的是,如果我SetPixel(dc,x,y,RGB(250,250,250))提前,和GetPixel(dc,x,y)後來,我可以總是 retreive正確的結果類似:

COLORREF result = SetPixel(dc,x,y,RGB(250,250,250)); 
COLORREF cr = GetPixel(dc,x,y); 

所以我覺得我應該協調好起來。我不知道爲什麼GetPixel()總是返回CLR_INVALID,但SetPixel()總是運行良好?有什麼建議麼?

+0

可能重複[GetPixel總是返回CLR \ _invalid(http://stackoverflow.com/questions/1496120/getpixel-always-returns-clr-invalid) –

+0

我不這麼認爲。我'SetPixel()'得到正確的結果,'GetPixel()'也得到正確的結果。協調不是問題。 – naive231

回答

1

GetPixel文檔

位圖必須在設備範圍內進行選擇,否則, CLR_INVALID是對所有像素返回。

請嘗試下面的代碼,看看它是否適用於您的設備上下文。的

HDC dc = ... // <-- your device context 
HDC memDC = CreateCompatibleDC(dc); 
HBITMAP memBM = CreateCompatibleBitmap(dc, 1, 1); 
SelectObject(memDC, memBM); 

int x = ... // point's coordinates 
int y = ... 
BitBlt(memDC, 0, 0, 1, 1, dc, x, y, SRCCOPY); 

COLORREF cr = GetPixel(memDC, 0, 0); 
std::cout << cr << std::endl; 

DeleteDC(memDC); 
DeleteObject(memBM); 
+0

我知道你的觀點,我認爲這可能有效。因爲我可以在'SetPixel()'之後的'GetPixel()'在同一點上正確地運行。我稍後再嘗試你的代碼。 – naive231

+0

*「所選對象是一個畫筆」* - 這沒有意義。設備上下文始終有選中的每個對象之一。它不像最後一次調用'SelectObject'來以某種方式激活該對象類型。它只是用一個新對象替換那個對象類型的插槽。有關介紹,請參閱[Device Contexts](https://msdn.microsoft.com/zh-cn/library/dd183553.aspx)。 – IInspectable

+0

@IInspectable是的,這是錯誤的。我刪除它。 –

相關問題