用双缓冲的话  BitBlt  是不是不支持png图像从缓冲DC复制到DC? 
那该怎么处理啊? 一开始我用GDI+的方式操作,但是显示不出图像.后来 我试着用atlimage.h里的 CImage cimg; 
cimg.Load(fileName); 
HBITMAP hbmp=cimg.Detach(); 这样据说可以像操作 BMP 图片一样处理图片 读是读出来了,可那样得到的是一个不具有透明通道的bmp图像,也就是说还是没办法正常使用win32应用

解决方案 »

  1.   

    可以调用bmp图片 然后在 透明处理下
    有函数可以做透明处理  只要背景色是单色就行
      

  2.   

        GDI+是支持PNG图像格式的。所谓双缓存是指在绘图之前先在内存中创建一块虚拟的绘图表面(相当于画布),也就是位图绘图表面,然后把要进行的图形图像操作都在这个内存位图绘图表面上进行,把所有的图形图像操作都做完了之后再用位块传输函数BitBlt一次性的把源绘图表面(即在内存中创建的虚拟绘图表面)调到目的绘图表面(即显示屏幕)上来显示。用这种方法可以克服频繁重绘时所引起的屏幕闪烁,而且效率相当高。知道了这个过程后,楼主可以先创建一个内存位图绘图表面,然后再把所要载入的图片载入到这个内存绘图表面来,需要的话还可以对这个载入的图片进行操作,比如缩放,旋转,在这个图片上再进行一些给图操作都可以,对图片的所有操作都进行完了之后再,再用BitBlt函数进行位块传输即可。
      

  3.   

    你的意思是AlphaBlend吧?  那png的话没有办法实现吗?
      

  4.   

    谢谢2楼的回答BitBlt(hWndDC,0,0,800,600,bufferDC,0,0,SRCCOPY);如果我把png图像加载进了缓冲区DC,并且在上面画了出来 ,然后我再用Bitbit  把缓冲区DC复制到DC上 ,  png可以被复制吗?   
      

  5.   

    不好意思,PNG格式的我也没试过,不过照理论上说,只要PNG图像能够被解析能够被载入到内存绘图表面,那应该就可以进行位块传输,你可以一试。
      

  6.   

    .bmp的透明显示
    先把你要处理的图片复制一张,对这两张图片这样处理。一张:除要显示的位置以外的区域用黑色填充,另一张:把要显示的位置用黑色填充,其余区域用白色填充。完了之后就可以用bitbit显示了。
    HBITMAP pic1;
    HBITMAP pic2;
    ///导入图片(这里也可以加入到资源里用LoadBitmap(hInst, MAKEINTRESOURCE(ID号));)
    pic1 = (HBITMAP)LoadImage(NULL, "图片1位置", IMAGE_BITMAP, 图片长, 图片宽
           , LR_LOADFROMFILE);
    pic2 = (HBITMAP)LoadImage(NULL, "图片2位置", IMAGE_BITMAP, 图片长, 图片宽
           , LR_LOADFROMFILE);HDC mapdc;                
    HDC buffdc;
    HDC hdc;hdc = GetDC(hWnd);
    mapdc = CreateCompatibleDC(hdc);
    buffdc = CreateCompatibleDC(hdc);
    SelectObject(buffdc , pic1);
    BitBlt(mapdc, 0, 0, 图片长, 图片宽, buffdc, 0, 0, SRCAND);
    SelectObject(buffdc , pic2);
    BitBlt(mapdc, 0, 0, 图片长, 图片宽, buffdc, 0, 0, SRCPAINT);
    ///
    BitBlt(hdc, 0, 0, 图片长, 图片宽, mapdc, 0, 0, SRCPAINT);
    试试效果吧,透明效果搞定,双缓冲搞定,加载图片时不要加反了哈,反了可达不到效果哦。~_~不知道是不是LZ想要的。
      

  7.   

    楼主,我首先要知道你想用GDI还是GDI+.如果用的GDI+你可以这样:
    //先从文件名(即你的PNG图像文件)创建一个Bitmap对象
    Bitmap bmp=new Bitmap("filename.png");
    //然后再获取一个Graphics对象(它表示要显示的图像的绘图表面)用其DrawImage方法
    Graphics graphic =e.Graphics;
    graphic.DrawImage(bmp,0,0);
      

  8.   

    谢谢楼上的热心帮助  gdi+的操作没有问题,这点小弟可以确认了. bmp图像的透明处理小弟也懂点.不过终于知道了问题. 我在单独的win32  aply里没有这样做显示没有问题,所以也没想过会是这里的问题问题出在使用GDI+之前,需调用GdiplusStartup初始化GDI+函数库.虽然我不知道为何我的测试工程里没有问题  也许是BeginPaint  EndPaint里可以忽略?但是GdiplusStartup之后确实解决了问题.