用SHGetFileInfo函数取到某类型文件的图标,用SetPixel打标记并做成新的图标,显示出来后dwg,rar等类型的成功,doc,xls类型打上的标记显示都为黑色,(实际应该是红,绿等)调试SetPixel改的颜色正确,不是黑色,但为什么显示出来的就成黑色了,而且其他类型的图标正确,就office文件的不对是什么原因?我装的是office2007,是不是office2007的图标格式与别的程序图标不一样?
解决方案 »
- 通过USB摄像头得到了JPG的数据,如何将数据存成JPG的文件
- 关于GetClipBox
- CToolTipCtrl的问题?
- 把向clistview中插入数据的代码从OnInitialUpdate拷贝到一个响应函数中就插入不了数据了?
- vc rich控件回车无法换行是为什么?
- 操作一段时间后, ListCtrl 中显示的内容全部消失, 内存耗完? 可只有200条记录时也会出
- Connecting SQL Sever时的奇怪问题
- 程序装配问题:一个exe文件,它依赖于一个自造的dll文件,怎么装配为好?
- 关于C++中文件合并问题-文件格式转换问题(急等!!!!!!!!!!!!!!)
- 对话框中的树型
- 如何编辑另一进程窗口中edit控件中的字符串
- 【请教】CString出现的一个问题,觉得有点匪夷所思
office2007用的是大图标,256 x 256的
m_treeCtrl.SetImageList(&m_cImageList, TVSIL_NORMAL);
是不是调色盘的问题?估计显示也是比较特别的。
获取ico的色深,然后使用它存在的颜色来画点试试?
具体,没有操作过。
会不会是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;
}
::BitBlt(hMemDCNew, 0, 0, dwWidth, dwHeight, hMemDC, 0, 0, SRCCOPY);
之后加
::BitBlt(hMemDCNew, 0, 0, dwWidth, dwHeight, hMemDCOver, 0, 0,SRCAND);达到想要的效果了,但对GDI不熟还是不太明白其中道理。可以肯定的是2007的图标的确和其他程序的不同。