Programming/MFC-C++

마우스 커서 비트맵 가져오기

빠릿베짱이 2013. 10. 29. 10:32
반응형
	HBITMAP hbitmap;
	BITMAP bitmap;
	BITMAPINFO bmi;
	HDC hdcScreen = ::GetDC(NULL);
	HDC hdcMem = CreateCompatibleDC(hdcScreen);
	
	CURSORINFO cursorInfo = { 0 };
	cursorInfo.cbSize = sizeof(cursorInfo);
	
	GetCursorInfo(&cursorInfo);
	
	ICONINFO ii = {0};
	GetIconInfo(cursorInfo.hCursor, &ii);

	CBitmap* pBitmap = CBitmap::FromHandle(ii.hbmMask);
	BITMAP Bitmap;
	
	pBitmap->GetBitmap(&Bitmap);

	int len = Bitmap.bmHeight * Bitmap.bmWidth/8;
	BYTE* buffer = new BYTE[len];
	GetBitmapBits(ii.hbmMask, len, buffer);

	int nWidth=Bitmap.bmWidth;
	int nHeight=Bitmap.bmHeight;

	
	int bufferindx=0;
	BYTE* MaskBuffer = new BYTE[nWidth* nHeight];
	int y,x;
	for(y=0; y< nHeight; y++)
	{
		for(x=0; x< nWidth; x+=8)
		{
			for(int i=0; i<8;i++)
			{
				int nval = buffer[bufferindx] & (0x80 >> i);
				if(nval == 0)
				{
					MaskBuffer[y*nWidth + x+i] = 1;					
				}
				else
					MaskBuffer[y*nWidth + x+i] = 0;
					
			}
			bufferindx++;
		}
	}

	for( y=0; y< nHeight; y++)
	{
		for(x=0; x< nWidth; x++)
		{
			cout << (int)MaskBuffer[y*nWidth + x];
		}
		cout << endl;
	}	
	
	delete MaskBuffer;
	delete buffer;

 

 

위의 코드는 마우스 커서의 핸들을 가져와서, 비트맵을 얻는 코드입니다.

헌데, 이상하게 ii.hbmMask은 메모리를 가져올 수 있는데, hbmColor는 Null이 나오더군요.

여튼 이 코드는 마우스 커서의 마스크 이미지를 가져오는 소스라고 생각하시면 되겠습니다.

마스크라서, 비트맵을 표현하는 것이 0, 1 이므로, 32*64 마우스 커서 이미지일 경우

32bit * 64 이므로 256바이트가 필요하며, 256바이트로 커서 이미지를 얻어와서

이를 다시 비트단위로 이미지화하는 코드까지 포함된 예제입니다.

반응형