用SHGetFileInfo函数取到某类型文件的图标,用SetPixel打标记并做成新的图标,显示出来后dwg,rar等类型的成功,doc,xls类型打上的标记显示都为黑色,(实际应该是红,绿等)调试SetPixel改的颜色正确,不是黑色,但为什么显示出来的就成黑色了,而且其他类型的图标正确,就office文件的不对是什么原因?我装的是office2007,是不是office2007的图标格式与别的程序图标不一样?

解决方案 »

  1.   

    不处理,能够正常现实么
    office2007用的是大图标,256 x 256的
      

  2.   

    不处理的正常显示,office的文档的也能,处理的其实也能显示,就是颜色不对,明明SetPixel的是绿色,显示出来的却是黑色。我是把图标加入CImageList,给树控件用的。m_cImageList.Create(16, 16, ILC_MASK|ILC_COLOR32, ICON_STATE_NUM, ICON_STATE_NUM);
    m_treeCtrl.SetImageList(&m_cImageList, TVSIL_NORMAL);
      

  3.   

    色深?楼上的能多指点一二吗?找了一个把HICON保存为文件的函数,把显示错误的图标存为ICO文件,ico文件是对的,不是黑色,这是为什么???
      

  4.   

    ICO有单色,16色,256色。
    是不是调色盘的问题?估计显示也是比较特别的。
    获取ico的色深,然后使用它存在的颜色来画点试试?
    具体,没有操作过。
      

  5.   

    应该不是图标大小的问题,对图标hbmColor位图逐像素判断,是16*16大的。
      

  6.   


    会不会是office2007图标使用的颜色位数高导致的,32位色可以用::SetPixel修改吧?从图标自己里取一个像素再修改,还是黑的。有大侠在吗,帮我看看,是不是代码的问题?// hIcon原图标,
    // hOver标记图标
    // 返回新图标
    HICON CStateICOGenerator::OverWriteICO(HICON hIcon, HICON hOver)
    {
    HICON hRetIcon = NULL; // 取图标信息
    ICONINFO csII;
    if (GetIconInfo(hIcon, &csII) == FALSE)
    {
    return hRetIcon;
    } ICONINFO csIIOver;
    if (GetIconInfo(hOver, &csIIOver) == FALSE)
    {
    ::DeleteObject(csII.hbmColor);
    ::DeleteObject(csII.hbmMask);
    return hRetIcon;
    }

    HDC hMainDC = ::GetDC(NULL);
        HDC hMemDC = ::CreateCompatibleDC(hMainDC);
        HDC hMemDCOver = ::CreateCompatibleDC(hMainDC);
    HDC hMemDCNew = ::CreateCompatibleDC(hMainDC);
        if (hMainDC == NULL || hMemDC == NULL || hMemDCOver == NULL || hMemDCNew == NULL) 
    {
    ::DeleteObject(csIIOver.hbmColor);
    ::DeleteObject(csIIOver.hbmMask);  
    ::DeleteObject(csII.hbmColor);
    ::DeleteObject(csII.hbmMask);
    return hRetIcon;
    }
    BITMAP  bmp;
        if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp))
        {
            DWORD   dwWidth  = csII.xHotspot*2;
            DWORD   dwHeight = csII.yHotspot*2;

    ICONINFO csIINew;
    // 复制原图标hbmColor到新图标
            csIINew.hbmColor = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
            if (csIINew.hbmColor)
            {
                HBITMAP hOldBmp1 = (HBITMAP)::SelectObject(hMemDC, csII.hbmColor);
    HBITMAP hOldBmp2 = (HBITMAP)::SelectObject(hMemDCOver, csIIOver.hbmColor);
                HBITMAP hOldBmp3 = (HBITMAP)::SelectObject(hMemDCNew, csIINew.hbmColor);

                ::BitBlt(hMemDCNew, 0, 0, dwWidth, dwHeight, hMemDC, 0, 0, SRCCOPY);

                DWORD    dwLoopY = 0;
    DWORD    dwLoopX = 0;
                COLORREF crPixel = 0;
            // 逐像素判断
                for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
                {
                    for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
                    {
                        crPixel = ::GetPixel(hMemDCOver, dwLoopX, dwLoopY);
    // 标记图标上该像素不是黑色,修改新图标
                        if (GetRValue(crPixel) != 0xff && GetGValue(crPixel) !=0xff && GetBValue(crPixel) != 0xff )
    {
    // crPixel = ::GetPixel(hMemDC, 1, 1); 取原图标自己的一个像素修改后也是黑色
    ::SetPixel(hMemDCNew, dwLoopX, dwLoopY, crPixel);
    }
                    } // for

                } // for


                ::SelectObject(hMemDC, hOldBmp1);
                ::SelectObject(hMemDCOver, hOldBmp2);
    ::SelectObject(hMemDCNew, hOldBmp3);

                csIINew.hbmMask = csII.hbmMask;

                csIINew.fIcon = TRUE;
                hRetIcon = ::CreateIconIndirect(&csIINew);
            } // if


            ::DeleteObject(csIINew.hbmColor);

        } // if

    ::DeleteObject(csIIOver.hbmColor);
        ::DeleteObject(csIIOver.hbmMask);  
    ::DeleteObject(csII.hbmColor);
    ::DeleteObject(csII.hbmMask);
        ::DeleteDC(hMemDC);
        ::DeleteDC(hMemDCOver);
    ::DeleteDC(hMemDCNew);
        ::ReleaseDC(NULL, hMainDC);

        return hRetIcon;
    }
      

  7.   

    解决了,在
    ::BitBlt(hMemDCNew, 0, 0, dwWidth, dwHeight, hMemDC, 0, 0, SRCCOPY);
    之后加
    ::BitBlt(hMemDCNew, 0, 0, dwWidth, dwHeight, hMemDCOver, 0, 0,SRCAND);达到想要的效果了,但对GDI不熟还是不太明白其中道理。可以肯定的是2007的图标的确和其他程序的不同。