Changing color of icons dynamically
Hi,
I need to change the color of icons dynamically, when i try to change
the color by following the steps, the background color is getting
mismatched.
HICON CGenericMFCDlg::CreateGrayscaleIcon(HICON hIcon)
{
HICON hGrayIcon = NULL;
HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL,hMaskDC
= NULL;
BITMAP bmp;
HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL,hOldBmp3 = NULL;
ICONINFO csII, csGrayII;
BOOL bRetValue = FALSE;
bRetValue = ::GetIconInfo(hIcon, &csII);
if (bRetValue == FALSE) return NULL;
hMainDC = ::GetDC(NULL);
hMemDC1 = ::CreateCompatibleDC(hMainDC);
hMemDC2 = ::CreateCompatibleDC(hMainDC);
hMaskDC = ::CreateCompatibleDC(hMainDC);
if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL) return
NULL;
if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp))
{
DWORD dwWidth = csII.xHotspot*2;
DWORD dwHeight = csII.yHotspot*2;
csGrayII.hbmColor = ::CreateBitmap(dwWidth, dwHeight,
bmp.bmPlanes,
bmp.bmBitsPixel, NULL);
if (csGrayII.hbmColor)
{
hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, csII.hbmColor);
hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2,
csGrayII.hbmColor);
hOldBmp3 = (HBITMAP)::SelectObject(hMaskDC, csII.hbmMask);
//::BitBlt(hMemDC2, 0, 0, dwWidth, dwHeight, hMemDC1, 0, 0,
// SRCCOPY);
DWORD dwLoopY = 0, dwLoopX = 0;
COLORREF crPixel = 0,crMaskPixel;
BYTE byNewPixel = 0;
for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
{
for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
{
crPixel = ::GetPixel(hMemDC1, dwLoopX, dwLoopY);
crMaskPixel = ::GetPixel(hMaskDC, dwLoopX, dwLoopY);
byNewPixel = (BYTE)((GetRValue(crPixel)) +
(GetGValue(crPixel)) +
(GetBValue(crPixel)));
int R = GetRValue(crPixel);
int B = GetBValue(crPixel);
int G = GetGValue(crPixel);
int R2 = GetRValue(crMaskPixel);
int B2 = GetBValue(crMaskPixel);
int G2 = GetGValue(crMaskPixel);
// Here are we can add one checking and change the color we
need.
if (crPixel)
::SetPixel(hMemDC2, dwLoopX, dwLoopY,
RGB(R,G,B));
else
TRACE("test");
} // for
} // for
::SelectObject(hMemDC1, hOldBmp1);
::SelectObject(hMemDC2, hOldBmp2);
csGrayII.hbmMask = csII.hbmMask;
csGrayII.fIcon = TRUE;
hGrayIcon = ::CreateIconIndirect(&csGrayII);
} // if
::DeleteObject(csGrayII.hbmColor);
//::DeleteObject(csGrayII.hbmMask);
} // if
::DeleteObject(csII.hbmColor);
::DeleteObject(csII.hbmMask);
::DeleteDC(hMemDC1);
::DeleteDC(hMemDC2);
::ReleaseDC(NULL, hMainDC);
return hGrayIcon;
} // End of CreateGrayscaleIco
I got this sample from CodeProject.
Please help me
Subash