在一个图像处理工程中,在XXXView.cpp文件头中已经 #include "dib.h"。OnDraw函数如下:
void CXXXView::OnDraw(CDC* pDC)
{
CXXXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( pDoc->m_pDib )
{
pDib = pDoc->m_pDib;//得到pDib指针作为全局的指针 lpDIBBits = pDib->GetDibData();
lWidth = pDib->GetWidth();
lLinebits = WIDTHBYTES( 8*lWidth );
lHeight = pDib->GetHeight();
SetScrollSizes(MM_TEXT, CSize(lLinebits, lHeight));
pDib->Draw(pDC->m_hDC, 0, 0, lLinebits, lHeight,
0, 0, lLinebits, lHeight, DIB_RGB_COLORS, SRCCOPY); }
调试在GetDibData()报错,CDIB类中的该函数描述为:
unsigned char* CDib::GetDibData() const
{
return m_pDibData;
}
调试模式下的值为:
pDoc:0x00431520
pDoc->m_pDib:0x00000000
是否说明m_pDib并没有所对应内存空间?
void CXXXView::OnDraw(CDC* pDC)
{
CXXXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( pDoc->m_pDib )
{
pDib = pDoc->m_pDib;//得到pDib指针作为全局的指针 lpDIBBits = pDib->GetDibData();
lWidth = pDib->GetWidth();
lLinebits = WIDTHBYTES( 8*lWidth );
lHeight = pDib->GetHeight();
SetScrollSizes(MM_TEXT, CSize(lLinebits, lHeight));
pDib->Draw(pDC->m_hDC, 0, 0, lLinebits, lHeight,
0, 0, lLinebits, lHeight, DIB_RGB_COLORS, SRCCOPY); }
调试在GetDibData()报错,CDIB类中的该函数描述为:
unsigned char* CDib::GetDibData() const
{
return m_pDibData;
}
调试模式下的值为:
pDoc:0x00431520
pDoc->m_pDib:0x00000000
是否说明m_pDib并没有所对应内存空间?
说明你加载DIB就失败了。
DIB.cpp主要的函数如下
#include "stdafx.h"
#include "Dib.h"
const unsigned int GROWBYTES = 1024;//IMPLEMENT_DYNAMIC(CDib, CObject)CDib::CDib()
{
Init();
}CDib::CDib(const char* pszDibFileName)
{
Init();
LoadFile(pszDibFileName);
}
CDib::~CDib()
{
if(m_pBackup)
delete[] m_pBackup;
m_pBackup = NULL; if(m_pFileData)
free(m_pFileData);
if(m_pDataS)
delete[] m_pDataS; m_pDataS = NULL;
m_pRGBQuad = NULL;
m_pBitmapInfo = NULL;
m_pBitmapInfoHeader = NULL;
m_pBitmapFileHeader = NULL;
m_pszFileName = NULL;
m_pDibData = NULL;
}#ifdef _DEBUG
void CDib::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}void CDib::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_pszFileName != NULL);
// ASSERT(m_hDIB != 0);
}
#endif
void CDib::Init()
{
m_bValid = false;
m_fileLeng = 0;
m_nWidth = 0; //宽度
m_nHeight = 0; //高度
m_nBitCount = 0; //每个像素占有的位数
m_nTotalColors = 0; //颜色总数
m_pDibData = NULL; //位图像素数据
m_pszFileName = NULL;
m_pBitmapFileHeader = NULL;
m_pBitmapInfoHeader = NULL;
m_pBitmapInfo = NULL;
m_pRGBQuad = NULL; //RGBQUAD 表项
m_pDataS = NULL;
m_pFileData = NULL;
m_pBackup = NULL;
}long CDib::GetWidth() const
{
return m_nWidth;
}
long CDib::GetHeight() const
{
return m_nHeight;
}//获取数据缓冲区的大小
unsigned long CDib::GetSize()
{
if (m_pBitmapInfoHeader->biSizeImage != 0)
return (m_pBitmapInfoHeader->biSizeImage);
else
return (unsigned long)WIDTHBYTES(m_nWidth*m_nBitCount) * (unsigned long)m_nHeight;
}unsigned char CDib::GetBitCount() const
{
return m_nBitCount;
}unsigned int CDib::GetColorNumber() const
{
unsigned int nColors = 0; if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
(m_pBitmapInfoHeader->biBitCount < 9))
{
switch (m_pBitmapInfoHeader->biBitCount)
{
case 1: nColors = 2; break;
case 4: nColors = 16; break;
case 8: nColors = 256;break;
}
}
else
nColors = (unsigned int) m_pBitmapInfoHeader->biClrUsed; return nColors;
}char* CDib::GetFileName() const
{
return m_pszFileName;
}unsigned char* CDib::GetDibData() const
{
return m_pDibData;
}RGBQUAD* CDib::GetRGBQuad() const
{
return m_pRGBQuad;
}BITMAPINFO* CDib::GetBmpInfo() const
{
return m_pBitmapInfo;
}unsigned long CDib::GetFileLeng()
{
return m_fileLeng;
}bool CDib::IsValid() const
{
return m_bValid;
}
...