HBITMAP CreateGrayscaleIcon(IMAGEINFO *pImageInfo)
{
if (pImageInfo == NULL)
{
return NULL;
} HBITMAP     hGrayImage = NULL;
HDC    hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
BITMAP    bmp;
HBITMAP    hOldBmp1 = NULL, hOldBmp2 = NULL;
IMAGEINFO    iiGray; hMainDC = ::GetDC(NULL);
hMemDC1 = ::CreateCompatibleDC(hMainDC);
hMemDC2 = ::CreateCompatibleDC(hMainDC);
if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)
{
return NULL;
} if (::GetObject(pImageInfo->hbmImage, sizeof(BITMAP), &bmp))
{
DWORD dwWidth  = pImageInfo->rcImage.right - pImageInfo->rcImage.left;
DWORD dwHeight = pImageInfo->rcImage.bottom - pImageInfo->rcImage.top; iiGray.hbmImage = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
if (iiGray.hbmImage)
{
hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, pImageInfo->hbmImage);
hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, iiGray.hbmImage); COLORREF crPixel = 0;
BYTE byNewPixel = 0; for (DWORD y=0; y<dwHeight; y++)
{
for (DWORD x=0; x<dwWidth; x++)
{
crPixel = ::GetPixel(hMemDC1, x, y);
byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114)); if (crPixel)
::SetPixel(hMemDC2, x, y, RGB(byNewPixel, byNewPixel, byNewPixel));
else
::SetPixel(hMemDC2, x, y, crPixel);
} // for
} // for ::SelectObject(hMemDC1, hOldBmp1);
::SelectObject(hMemDC2, hOldBmp2); iiGray.hbmMask = pImageInfo->hbmMask;            ::GetObject(iiGray.hbmImage, sizeof(BITMAP), &bmp);
hGrayImage = ::CreateBitmapIndirect(&bmp);
} // if ::DeleteObject(iiGray.hbmImage);
} // if ::DeleteDC(hMemDC1);
::DeleteDC(hMemDC2);
::ReleaseDC(NULL, hMainDC); return hGrayImage;
}看看这段代码何处有误,按它产生的hGrayImage画出来是黑色的