关于已经处理过的透明的png图片在VS2010/MFC中显示的有关问题

关于已经处理过的透明的png图片在VS2010/MFC中显示的问题
我已经耗了一个下午了,包括查阅资料,进行程序调试,但是还是有问题。问题是调试成功,但是运行出来后,就是一个bug。请各位高人指点迷津。
我要实现的功能是点击工具栏,然后鼠标点击视图框,然后图片进行显示。所以我建立了一个图像显示的类,专门负责显示图片。因为工具栏上有多种图片,所以建立了一个链表来存储图片。看网络上说,利用Cimage来显示png图像,以及有网友说显示出来的png图像不是透明的,所以利用自己的办法来显示透明的图像,我综合了网上所说的方法来修改自己的程序,但是调试成功,无法运行,图片无法显示,出现bug。现在把代码贴下:
[code=C/C++][/code]
在stdafx.h中已经添加了
#include <atlimage.h>
在Doc.h中声明了
public:
CImage img;
在Doc.cpp中添加了代码:
void CNewToolBarDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
if(!img.IsNull()) img.Destroy();
  img.Load(ar.GetFile()->GetFilePath()); 
}
}
在vew.cpp中Draw函数中:
void CNewToolBarView::OnDraw(CDC* pDC)
{
CNewToolBarDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
  return;
if(!pDoc->img.IsNull()) pDoc->img.Draw(pDC->m_hDC, 0, 0); 
POSITION pos=m_objList.GetHeadPosition();//建立存储图片的链表
while(pos)
{
CChemObject* obj=m_objList.GetNext(pos);
obj->Draw(pDC);
}


}
在新建的图片类中的cpp文件的Draw函数中:

 CImage img;
CDC memdc;  
switch (id)
{
case 1:
img.Load("1.png");
break;
case 2:
img.Load("2.png");
break;
case 3:
img.Load("3.png");
break;
case 4:
img.Load("4.png");
break;
case 6:
img.Load("6.png");
break;
case 7:
img.Load("7.png");
break;

}
for(int i = 0; i < img.GetWidth(); ++i)
  {
  for(int j = 0; j < img.GetHeight(); ++j)
  {
  unsigned char* pucColor = (unsigned char*)img.GetPixelAddress(i , j);
  pucColor[0] = pucColor[0] * pucColor[3] / 255;
  pucColor[1] = pucColor[1] * pucColor[3] / 255;
  pucColor[2] = pucColor[2] * pucColor[3] / 255;
  }
  }
  img.AlphaBlend(pDC->m_hDC, x, y);  
  }
最后的结果是调试成功,无法运行,运行有bug,无法显示图片,请解密。



------解决方案--------------------
测试楼主代码,根本无法编译,你提供的代码部分缺得太多了,请补充完整,特别是CChemObject类,还有id是什么?等等。
------解决方案--------------------
先显示一张图看是否可以。

CImage img1;
img1.Load(L"C:\\test.png")
for(int i=0; i<img1->GetWidth(); ++i)
 {
for(int j=0; j<img1->GetHeight(); ++j)
{
unsigned char* pucColor=(unsigned char*)img1->GetPixelAddress(i,j); 
pucColor[0]=pucColor[0]*pucColor[3]/255;
pucColor[1]=pucColor[1]*pucColor[3]/255;
pucColor[2]=pucColor[2]*pucColor[3]/255;
}
}
img1->Draw(hDC,10,10);
------解决方案--------------------
自己的方法显示png?
用GDI+或CImage是支持Alpha通道的啊
------解决方案--------------------
探讨

引用:

自己的方法显示png?
用GDI+或CImage是支持Alpha通道的啊
我在网上查到说,有人用CImage来显示图片,但是,显示出来的图片不是透明的哈,是跟位图显示一样的,是有底色的。所以有高手就自己解决了,然后我就借用了,但是调试成功,运行有bug。

------解决方案--------------------
bool LVEdit::Load(LPCTSTR pName, LPCTSTR pType, HMODULE hInst)
{
Empty();
HRSRC hResource = ::FindResource(hInst, pName, pType);
if (!hResource)
return false;

DWORD imageSize = ::SizeofResource(hInst, hResource);
if (!imageSize)
return false;

const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
if (!pResourceData)