关于已经处理过的透明的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通道的啊
------解决方案--------------------
------解决方案--------------------
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)
我已经耗了一个下午了,包括查阅资料,进行程序调试,但是还是有问题。问题是调试成功,但是运行出来后,就是一个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通道的啊
------解决方案--------------------
------解决方案--------------------
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)