问题根源应该是出在AlphaBlend的参数上,LZ可以先不用使用AlphaBlend,作为测试,先使用Bitblt看看效果
另外 使用之前,按下面设置一下 看看效果
SetStretchBltMode( ToDC, STRETCH_HALFTONE)

解决方案 »

  1.   

    我要的是透明效果,用下面这个出来背景是透明的:
    ImageList_Draw((HIMAGELIST)imagelist, i, dc.GetSafeHdc(), i*50, 10, ILD_TRANSPARENT);而先ImageList_Draw到内存DC再Bitblt则背景为黑色,用AlphaBlend代替Bitblt则颜色失真,郁闷。
      

  2.   

    你要的如果是背景透明,非背景的透明,指定一个透明色,使用
    TransparentBlt() 
      

  3.   

    据我的了解系统的GDI是没有Alpha通道, 先关的函数都不会处理Alpha的数据, 
    用了GDI的函数会导致Alpha数据丢失, ImageList_Draw之类的就这样要有Alpha就不要用GDI, 全改用GDI+
      

  4.   

    关键是
    我获取的是系统的带ALPHA通道真彩色超大图标,XP下最大为48×48,XP以上系统最大256×256,目的是将它转为同样带ALPHA通道的32位GDI+Bitmap,但是奇怪的是那些带阴影的图标转为GDI+Bitmap后完全正常,而不带阴影的图标转换后不是颜色失真就是没有图像
      

  5.   

    ImageList_Draw是可以绘制带ALPHA通道图标的,我上面说了用ImageList_Draw直接绘制到窗口DC,那图标颜色完全是正常的,即使图标带ALPHA通道也一样,我就是郁闷它为什么直接绘制到窗口DC就正常,而绘制到内存DC在有该内存DC用AlphaBlend绘制到窗口DC颜色就失真。
    GDI+貌似没有函数可以直接从IImageList读取图标啊?
      

  6.   

    dcColorIcon.SelectObject(&cbColorIcon); 之后填充一个背景色试试看,默认的位图应该是黑色的
      

  7.   


    我要的主要是将XP系统中带ALPHA通道的图标转换为同样带ALPHA通道的32位CBitmap或32位GDI+Bitmap都可以,现在主要是用ImageList_Draw将图标绘制到CBitmap,再用Bitblt绘制到窗口颜色其实是正常的,只是这样会有黑色背景色,而我要的是透明背景色,用AlphaBlend代替Bitblt背景色可以透明,但图标颜色又失真。
      

  8.   

    GDI+怎么从IImagelist加载真彩色图标?貌似加载后绘制出来是带黑色背景的?
      

  9.   

    给dc 填充一个背景色试试
    CClientDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(&rect, RGB(255,255,255));
    …… //后面你的代码
      

  10.   


    我的目的是要提取XP系统并转换为内存位图,XP系统图标是带ALPHA通道的图标,我用ImageList_Draw将XP系统图标绘制到内存位图,然后如果用Bitblt将该内存位图绘制到CClientDC颜色是正常的,但背景色是黑的,已经没有ALPHA通道,用AlphaBlend将该内存位图绘制到CClientDC,ALPHA效果是有的,但颜色失真,这就是郁闷的地方。
    只要能将XP系统图标转换为GDI位图或者GDI+位图都可以,但似乎没有可行的方法?
      

  11.   

    用AlphaBlend绘制,带阴影的图标颜色是正常的,不带阴影的图标颜色严重失真,难道这些不带阴影的图标不是32位真彩色的?
      

  12.   

    上面这排正常颜色图标是以下代码绘制: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);
    }
      

  13.   

    为何先绘制到内存DC后再绘制到窗口DC颜色就失真? 难道这些颜色失真的图标只有256色或者更少,可是如果将AlphaBlend替换为bitblt颜色又正常只是背景不透明,真他妈的奇怪。