2010-09-30 125 views
1

我想從鼠標光標獲取位圖,但是使用下一個代碼,我只是無法獲取顏色。鼠標光標位圖

CURSORINFO cursorInfo = { 0 }; 
cursorInfo.cbSize = sizeof(cursorInfo); 

if (GetCursorInfo(&cursorInfo)) { 

    ICONINFO ii = {0}; 
    int p = GetIconInfo(cursorInfo.hCursor, &ii); 

    // get screen 
    HDC dc = GetDC(NULL); 
    HDC memDC = CreateCompatibleDC(dc); 
    //SelectObject(memDC, ii.hbmColor); 

    int counter = 0; 

    // 
    byte* bits[1000];// = new byte[w * 4]; 
    BITMAPINFO bmi; 
    memset(&bmi, 0, sizeof(BITMAPINFO)); 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth = 16; 
    bmi.bmiHeader.biHeight = 16; 
    bmi.bmiHeader.biBitCount = 32; 
    bmi.bmiHeader.biPlanes = 1; 
    bmi.bmiHeader.biCompression = BI_RGB; 
    bmi.bmiHeader.biSizeImage  = 0; 
    bmi.bmiHeader.biXPelsPerMeter = 0; 
    bmi.bmiHeader.biYPelsPerMeter = 0; 
    bmi.bmiHeader.biClrUsed  = 0; 
    bmi.bmiHeader.biClrImportant = 0; 
    int rv = ::GetDIBits(memDC, ii.hbmColor, 0, 1, (void**)&bits, &bmi, DIB_RGB_COLORS); 
} 

回答

0

你的代碼的問題我認爲是你爲'bits'變量分配內存的方式,以及你如何在GetDIBits函數中使用它。

首先,註釋部分byte* bits = new byte[w*4]byte* bits[1000]更好。當你寫byte* bits[1000]計算機給字節分配1000個指針時。這些指針中的每一個都不指向任何內容。

其次,GetDIBits接受LPVOID lpvBits作爲第5個參數。所以,它是一個指向void的指針。 在大多數平臺中,sizeof(void *)> sizeof(byte),所以你不能只傳遞一個字節數組,可能最好將指針傳遞給int或unsigned int(我不擅長Windows類型,所以也許更合適的東西應該更好,抱歉)。

所以,我的猜測是這樣的:

unsigned bits[1000]; 
memset(bits, 0, sizeof(bits)); 
//... 
int tv = GetDIBits(memDC, ii.hmbColor, 0, 1, (LPVOID)bits, /* ... */); 
1

開始通過獲取位圖的參數記錄由Windows:

BITMAP bitmap = {0}; 
GetObject(ii.hbmColor, sizeof(bitmap), &bitmap); 

可以使用返回的值來填充bmi結構。

而關於bmi結構:BITMAPINFO確實不是保留足夠的空間用於調色板。你應該創建自己的結構,這樣的:

struct BitmapPlusPalette 
{ 
    BITMAPINFOHEADER bmiHeader; 
    RGBQUAD palette[256]; 
}; 

計算所需的位圖的字節數是有點棘手,因爲它需要四捨五入:

w = ((bitmap.bmWidth * bitmap.bmBitsPixel) + 31)/8; 
byte* bits = new byte[w * bitmap.bmHeight]; 

而且這裏有一個修正版你的最後一行:

int rv = ::GetDIBits(dc, ii.hbmColor, 0, bitmap.bmHeight, bits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS); 
+0

在這種情況下,「BITMAPINFO」不會爲全部調色板保留空間嗎?爲什麼'GetDIBits'會寫入它(尤其是'DIB_RGB_COLORS')? – jamesdlin 2012-06-07 22:45:42

+0

@ jamesdlin,如果圖像不需要調色板,那麼你是對的,沒關係。儘管安全,但這並不是一個壞主意。 – 2012-06-07 22:55:49