某些PNG图片在CImage下会显示不出透明色,如果是这样,你的PNG需要重新制作。

解决方案 »

  1.   


    我单独输出png是有半透明的。我想知道代码里面有什么问题
      

  2.   

    首先,你要创建一个内存DC, 色深应该是 RGBA 32位 HDC hDC = ::GetDC(NULL);
    HDC hdcMemory = ::CreateCompatibleDC(hDC); BITMAPINFOHEADER stBmpInfoHeader = { 0 };   
    int nBytesPerLine = ((szWin.cx * 32 + 31) & (~31)) >> 3;
    stBmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);   
    stBmpInfoHeader.biWidth = szWin.cx;   
    stBmpInfoHeader.biHeight = szWin.cy;   
    stBmpInfoHeader.biPlanes = 1;
    stBmpInfoHeader.biBitCount = 32;   
    stBmpInfoHeader.biCompression = BI_RGB;   
    stBmpInfoHeader.biClrUsed = 0;   
    stBmpInfoHeader.biSizeImage = nBytesPerLine * szWin.cy;

    PUINT32 pvBits = NULL;   
    HBITMAP hbmpMem = ::CreateDIBSection(NULL, (PBITMAPINFO)&stBmpInfoHeader, DIB_RGB_COLORS, (LPVOID*)&pvBits, NULL, 0);
    draw到这个内存DC后 最后将内存DC draw到 窗口DC上, 才能双缓冲
      

  3.   


    怎么关联到CImage上去呢?
      

  4.   

    我觉得你应该创建一个待绘制窗口的CompatibleDC就可以了,用它做memDC,而且你的代码里也没有看到载入PNG的操作啊。
      

  5.   


    bottom是已经载入好的CImage对象。
    另外你说的CompatibleDC我不太懂,能不能详细说下
      

  6.   

    你这个比普通方法还要麻烦,而且还达不到效果。我现在改用C#实现了,只能最小化所有窗体然后获得桌面句柄。实时更新就算了,C#做出来性能太低,CPU占用率70%,还是用C++好。有时间用MFC再做一遍了
      

  7.   

    出现同样问题。加载PNG 图片都不能实现半透明的了
      

  8.   


    解决的办法我已经有了,创建一个屏幕缓冲区(CImage),将其他贴图都绘制到这个缓冲区中,最后将合成的图在绘制到窗体客户区或屏幕上。CDC *pDC = GetDC();
    //创建缓冲区
    CImage screen;
    CImage layer1,layer2;
    layer1.Load("....png");
    layer2.Load("....png");
    layer1.Draw(screen.GetDC(),0,0);
    layer2.Draw(screen.GetDC(),10,10);
    screen.ReleaseDC();//输出到窗体上
    Bitblt(pDC->m_hDC,0,0,screen.GetDC(),0,0);
    screen.ReleaseDC();
    ReleaseDC(pDC);
      

  9.   

    BitBlt”: 函数不接受 6 个参数