CxImage g_imgWarning;
g_imgWarning.LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG_WARNING),"PNG"),CXIMAGE_FORMAT_PNG);
//在OnPaint中进行如下操作
//贴背景图片
//
//贴警告图标
CRect rcWarning;
rcWarning.left = 70;
rcWarning.right = rcWarning.left + g_imgWarning.GetWidth();
rcWarning.top = 190;
rcWarning.bottom = rcWarning.top + g_imgWarning.GetHeight();
g_imgWarning.Draw(GetDC()->GetSafeHdc(), rcWarning);第一次绘制是没有问题的,但是当其他窗口在我的窗口上滑动的时候,PNG图片的阴影处越来越深,应该是重叠起来了。
我的PNG图片是在onpaint的最后绘制的,出现重叠,没道理啊。

解决方案 »

  1.   

    我前几天刚解决了一个半透明的问题,跟你的差不多,我的方法是把第一次绘制图形的保存到一个CBitmap中,下次需要显示的时候,加载bitmap就可以了
      

  2.   

    我本身就是在OnPaint中进行绘制的啊
      

  3.   

    看了下CxImgae的Draw实现,如果图片中存在透明度, 则他首先把那个DC的内容拷贝出来,然后在和原始图片做blend, 这结果就是越画越黑了.解决方法:用GDI+画
      

  4.   

    我做过一个对话框上贴png图的程序,也能实现透明背景,你看看能不能帮助你?BOOL CSplashDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // TODO:  在此添加额外的初始化
    HRSRC hRsrc=::FindResource(AfxGetResourceHandle(),
    MAKEINTRESOURCE(IDB_PNG1),
    _T("PNG"));
    if(hRsrc!=NULL)
    {
    HGLOBAL hImgData=::LoadResource(AfxGetResourceHandle(),hRsrc);
    if(hImgData==NULL)
    {
    ::FreeResource(hImgData);
    }
    else
    {
    LPVOID lpVoid = ::LockResource(hImgData);
    LPSTREAM pStream=NULL;
    DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
    HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
    LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
    ::memcpy(lpByte, lpVoid, dwSize);
    GlobalUnlock(hNew);
    HRESULT ht = CreateStreamOnHGlobal(hNew, TRUE, &pStream);
    if( ht != S_OK )
    {
    //ASSERT( FALSE );
    GlobalFree(hNew);
    }
    else
    {
    m_ImgBk.Load(pStream);
    GlobalFree(hNew);
    }
    ::FreeResource(hImgData);    
    }
    } //------------------------------透明背景----------------------------------//
    for(int i = 0; i < m_ImgBk.GetWidth(); ++i)
    {
    for(int j = 0; j < m_ImgBk.GetHeight(); ++j)
    {
    unsigned char* pucColor = reinterpret_cast<unsigned char *>(m_ImgBk.GetPixelAddress(i , j));
    pucColor[0] = pucColor[0] * pucColor[3] / 255;
    pucColor[1] = pucColor[1] * pucColor[3] / 255;
    pucColor[2] = pucColor[2] * pucColor[3] / 255;
    }
    } return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
    }BOOL CSplashDlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    m_ImgBk.Draw(pDC->GetSafeHdc(),0,0,m_ImgBk.GetWidth(),m_ImgBk.GetHeight(),
    0,0,m_ImgBk.GetWidth(),m_ImgBk.GetHeight()); return TRUE; //return CDialog::OnEraseBkgnd(pDC);
    }
      

  5.   

    改用GdiPlus之后阴影重叠的现象就显示了。
    还有个GdiPlus的问题,Image定义的时候,好像只能从文件路径或者流中获取资源,如何从VS2008导入的资源文件(资源的ID)初始化Image呢?