彩色ICON生成灰色ICON

// 由彩色ICON生成灰色ICON
HICON CreateGrayscaleIcon(HICON hIcon)
{
 HICON  hGrayIcon = NULL;
 HDC   hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
 BITMAP  bmp;
 HBITMAP  hOldBmp1 = NULL, hOldBmp2 = 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);
 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);

   //::BitBlt(hMemDC2, 0, 0, dwWidth, dwHeight, hMemDC1, 0, 0, SRCCOPY);

   DWORD  dwLoopY = 0, dwLoopX = 0;
   COLORREF crPixel = 0;
   BYTE  byNewPixel = 0;

   for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
   {
    for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
    {
     crPixel = ::GetPixel(hMemDC1, dwLoopX, dwLoopY);

     byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114));
     if (crPixel) ::SetPixel(hMemDC2, dwLoopX, dwLoopY, RGB(byNewPixel, byNewPixel, byNewPixel));
    } // 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 CreateGrayscaleIcon

// 应用

m_hColorIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_NOTEBOOK), IMAGE_ICON, 0, 0, 0);

m_hGrayIcon = CreateGrayscaleIcon(m_hColorIcon);
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值