奇怪,高手帮帮忙,获取的系统图标列表IImagelist图标颜色失真? 问题根源应该是出在AlphaBlend的参数上,LZ可以先不用使用AlphaBlend,作为测试,先使用Bitblt看看效果另外 使用之前,按下面设置一下 看看效果SetStretchBltMode( ToDC, STRETCH_HALFTONE) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我要的是透明效果,用下面这个出来背景是透明的:ImageList_Draw((HIMAGELIST)imagelist, i, dc.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);而先ImageList_Draw到内存DC再Bitblt则背景为黑色,用AlphaBlend代替Bitblt则颜色失真,郁闷。 你要的如果是背景透明,非背景的透明,指定一个透明色,使用TransparentBlt() 据我的了解系统的GDI是没有Alpha通道, 先关的函数都不会处理Alpha的数据, 用了GDI的函数会导致Alpha数据丢失, ImageList_Draw之类的就这样要有Alpha就不要用GDI, 全改用GDI+ 关键是我获取的是系统的带ALPHA通道真彩色超大图标,XP下最大为48×48,XP以上系统最大256×256,目的是将它转为同样带ALPHA通道的32位GDI+Bitmap,但是奇怪的是那些带阴影的图标转为GDI+Bitmap后完全正常,而不带阴影的图标转换后不是颜色失真就是没有图像 ImageList_Draw是可以绘制带ALPHA通道图标的,我上面说了用ImageList_Draw直接绘制到窗口DC,那图标颜色完全是正常的,即使图标带ALPHA通道也一样,我就是郁闷它为什么直接绘制到窗口DC就正常,而绘制到内存DC在有该内存DC用AlphaBlend绘制到窗口DC颜色就失真。GDI+貌似没有函数可以直接从IImageList读取图标啊? dcColorIcon.SelectObject(&cbColorIcon); 之后填充一个背景色试试看,默认的位图应该是黑色的 我要的主要是将XP系统中带ALPHA通道的图标转换为同样带ALPHA通道的32位CBitmap或32位GDI+Bitmap都可以,现在主要是用ImageList_Draw将图标绘制到CBitmap,再用Bitblt绘制到窗口颜色其实是正常的,只是这样会有黑色背景色,而我要的是透明背景色,用AlphaBlend代替Bitblt背景色可以透明,但图标颜色又失真。 GDI+怎么从IImagelist加载真彩色图标?貌似加载后绘制出来是带黑色背景的? 给dc 填充一个背景色试试CClientDC dc(this);CRect rect;GetClientRect(&rect);dc.FillSolidRect(&rect, RGB(255,255,255));…… //后面你的代码 我的目的是要提取XP系统并转换为内存位图,XP系统图标是带ALPHA通道的图标,我用ImageList_Draw将XP系统图标绘制到内存位图,然后如果用Bitblt将该内存位图绘制到CClientDC颜色是正常的,但背景色是黑的,已经没有ALPHA通道,用AlphaBlend将该内存位图绘制到CClientDC,ALPHA效果是有的,但颜色失真,这就是郁闷的地方。只要能将XP系统图标转换为GDI位图或者GDI+位图都可以,但似乎没有可行的方法? 用AlphaBlend绘制,带阴影的图标颜色是正常的,不带阴影的图标颜色严重失真,难道这些不带阴影的图标不是32位真彩色的? 上面这排正常颜色图标是以下代码绘制:for(int i = 0; i < iCount; i++){ HICON hIcon; ICONINFO iconinfo; imagelist->GetIcon(i, ILD_TRANSPARENT, &hIcon); ImageList_Draw((HIMAGELIST)imagelist, i, dc.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);//颜色正常}第二排是以下代码绘制,有3个不正常颜色的图标:for(int i = 0; i < iCount; i++){ HICON hIcon; ICONINFO iconinfo; imagelist->GetIcon(i, ILD_TRANSPARENT, &hIcon); CDC dcColorIcon; dcColorIcon.CreateCompatibleDC(&dc); CBitmap cbColorIcon; cbColorIcon.CreateCompatibleBitmap(&dc, 48,48); dcColorIcon.SelectObject(&cbColorIcon); ImageList_Draw((HIMAGELIST)imagelist, i, dcColorIcon.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT); dc.AlphaBlend(i*50, 60, 48,48, &dcColorIcon, 0,0, 48,48, bf);} 为何先绘制到内存DC后再绘制到窗口DC颜色就失真? 难道这些颜色失真的图标只有256色或者更少,可是如果将AlphaBlend替换为bitblt颜色又正常只是背景不透明,真他妈的奇怪。 怎么利用StretchBlt显示背景图? 怎么把一个自定义的结构数组序列化存盘再读出来 如何定义和调用两个系统热键呢? 两个记录集指针指向同一条记录 在socket服务程序中,怎样知道客户端的网卡mac地址? 异构数据库的问题 送一100分(lemo0173快快来取) help!怎样才能将dtpicker的初值置为空? 【求助】ListCtrl插入数据变空白怎么回事 编译错误????? 通用对话框求助 vc6.0 vc2008结构体默认的对齐方式不一样?
ImageList_Draw((HIMAGELIST)imagelist, i, dc.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);而先ImageList_Draw到内存DC再Bitblt则背景为黑色,用AlphaBlend代替Bitblt则颜色失真,郁闷。
TransparentBlt()
用了GDI的函数会导致Alpha数据丢失, ImageList_Draw之类的就这样要有Alpha就不要用GDI, 全改用GDI+
我获取的是系统的带ALPHA通道真彩色超大图标,XP下最大为48×48,XP以上系统最大256×256,目的是将它转为同样带ALPHA通道的32位GDI+Bitmap,但是奇怪的是那些带阴影的图标转为GDI+Bitmap后完全正常,而不带阴影的图标转换后不是颜色失真就是没有图像
GDI+貌似没有函数可以直接从IImageList读取图标啊?
我要的主要是将XP系统中带ALPHA通道的图标转换为同样带ALPHA通道的32位CBitmap或32位GDI+Bitmap都可以,现在主要是用ImageList_Draw将图标绘制到CBitmap,再用Bitblt绘制到窗口颜色其实是正常的,只是这样会有黑色背景色,而我要的是透明背景色,用AlphaBlend代替Bitblt背景色可以透明,但图标颜色又失真。
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(&rect, RGB(255,255,255));
…… //后面你的代码
我的目的是要提取XP系统并转换为内存位图,XP系统图标是带ALPHA通道的图标,我用ImageList_Draw将XP系统图标绘制到内存位图,然后如果用Bitblt将该内存位图绘制到CClientDC颜色是正常的,但背景色是黑的,已经没有ALPHA通道,用AlphaBlend将该内存位图绘制到CClientDC,ALPHA效果是有的,但颜色失真,这就是郁闷的地方。
只要能将XP系统图标转换为GDI位图或者GDI+位图都可以,但似乎没有可行的方法?
{
HICON hIcon;
ICONINFO iconinfo;
imagelist->GetIcon(i, ILD_TRANSPARENT, &hIcon);
ImageList_Draw((HIMAGELIST)imagelist, i, dc.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);//颜色正常
}第二排是以下代码绘制,有3个不正常颜色的图标:for(int i = 0; i < iCount; i++)
{
HICON hIcon;
ICONINFO iconinfo;
imagelist->GetIcon(i, ILD_TRANSPARENT, &hIcon);
CDC dcColorIcon; dcColorIcon.CreateCompatibleDC(&dc);
CBitmap cbColorIcon;
cbColorIcon.CreateCompatibleBitmap(&dc, 48,48);
dcColorIcon.SelectObject(&cbColorIcon);
ImageList_Draw((HIMAGELIST)imagelist, i, dcColorIcon.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);
dc.AlphaBlend(i*50, 60, 48,48, &dcColorIcon, 0,0, 48,48, bf);
}