本帖最后由 xyzhaopeng 于 2010-10-08 11:10:04 编辑

解决方案 »

  1.   

    楼主是不是要用TransparentBlt?
      

  2.   

    不是的,我的意思是说用GDI+绘图的时候PNG格式的图片是看不到背景的,
    用内存贴图的方式就会看见PNG图片的背景,如何将这个背景去掉
      

  3.   

    pDC->BitBlt(0,0,imgWidth,imgHigh,&m_memDC,0,0,SRCCOPY);
    改为
    pDC->BitBlt(0,0,imgWidth,imgHigh,&m_memDC,0,0,SRCPAINT);
      

  4.   

    应该是说把整个窗口(pDC)当前的图像作为背景先画到缓存里,然后再在缓存里画png,最后将缓存里的内容贴到pDC里。
      

  5.   

    我也遇到这种问题我想是因为 gdi+ 绘制时把png转成bmp的时候,留下了背景,png透明有个渐变的过程 转成bmp就会有不同的颜色来处理了。
      

  6.   

    http://hi.baidu.com/dyqq1234/blog/item/89f7008027b944d3bd3e1e6c.html
      

  7.   

    http://hi.baidu.com/dyqq1234/blog/item/89f7008027b944d3bd3e1e6c.html
      

  8.   

    http://hi.baidu.com/dyqq1234/blog/item/89f7008027b944d3bd3e1e6c.html
      

  9.   

    使用双缓冲时必须有一个内存位图(画布),不是背景Bitmap的话,那只能是单色图了,所以要填充它,否则就黑色。而要使用GDI+配合双缓冲,则会覆盖掉透明的PNG背景。
    如果是为了不闪烁,可以用GDI+的DrawCachedImage,不采用GDI的双缓冲方式。
      

  10.   

    硬要使用GDI双缓冲不知道有没有解决方法,但自己是没想出来。
    你可以使用GDI+的双缓冲试试。
    g(HDC)
    建立Bitmap
    从Bitmap获得memGraphics
    所有绘制都在memGraphics里,DoDraw(memGraphics)
    建立CachedBitmap
    用g绘制这个CachedBitmap
      

  11.   

    我说的是通过png透明部分要看到的背景
      

  12.   

    贴图总还是有坐标的吧
    你要把png贴到背景图片的什么位置
    把这个区域先贴到缓存里再上png图是不是能解决你现在的问题呢?
      

  13.   

    刚看了关于GDI+编程的书,来看一看
      

  14.   

    这样不太好吧,要是换个背景,难道又把其他的背景贴到缓存里面,然后再去贴PNG的图片?
      

  15.   

    我提一个思路
    不过我也没试过
    大家都知道GDI+处理贴图时是可以指定alpha信息的
    是不是可以考虑通过GDI+的方式实现双缓冲
    当然这个缓冲区中实现的是一个完全透明的图片
    然后再在这个图片上贴图
    也许这个方法能解决你的问题
    回头我也研究一下
    有结果的话回合大家分享
      

  16.   

    楼主可以看看我这篇博客,有讲到 PNG 显示 为透明的 办法。http://blog.csdn.net/ilysony/archive/2010/10/11/5932844.aspx
      

  17.   

    LZ就是不是去尝试?GDI+的双缓冲不会闪的。硬要按常理用GDI双缓冲来解决?
      

  18.   

    gdi+里面貌似没有这个函数吧,DrawCachedImage,只有DrawCachedBitmap
      

  19.   

    在贴图之前,我先将窗口的背景作为贴图的背景先画一次,然后再将PNG图片画到缓冲里面,最后在需要贴图的时候显示出来,这样使用双缓冲显示PNG图片的时候,PNG的背景就是透明的了,如果大家有更好的办法,请告诉我